Странный\n в кодировке base64 в Ruby
Встроенная библиотека Base64 в Ruby добавляет некоторые "\n". Я не могу узнать причину. Для этого специального примера:
irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'base64'
=> true
irb(main):003:0> str = "1110--ad6ca0b06e1fbeb7e6518a0418a73a6e04a67054"
=> "1110--ad6ca0b06e1fbeb7e6518a0418a73a6e04a67054"
irb(main):004:0> Base64.encode64(str)
=> "MTExMC0tYWQ2Y2EwYjA2ZTFmYmViN2U2NTE4YTA0MThhNzNhNmUwNGE2NzA1\nNA==\n"
\n находятся на последней и шестой позиции от конца. Декодер (Base64.decode64) отлично возвращает старую строку. Странно, эти \n не добавляют никакого значения в закодированную строку. Когда я удаляю строки новой строки из выходной строки, декодер полностью декодирует ее снова.
irb(main):005:0> Base64.decode64(Base64.encode64(str).gsub("\n", '')) == str
=> true
Более того, я использовал другую JS-библиотеку для создания кодированного вывода base64 той же входной строки, вывод идет без \n.
Это ошибка или что-то еще? Кто-нибудь сталкивался с этой проблемой раньше?
FYI,
$ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
Ответы
Ответ 1
Изменить: С тех пор, как я написал этот ответ, был добавлен Base64.strict_encode64()
, который не добавляет новые строки.
Документы несколько сбивают с толку, предполагается, что метод b64encode
добавляет новую строку для каждого 60-го символа, а в примере для метода encode64
фактически используется метод b64encode
.
Похоже, что метод pack("m")
для класса Array, используемый в encode64
, также добавляет новые строки. Я бы посчитал ошибкой дизайна, что это не является обязательным.
Вы можете удалить символы перевода строки самостоятельно, или, если вы используете rails, есть ActiveSupport :: CoreExtensions :: Base64 :: Encoding с помощью метода encode64s
.
Ответ 2
В ruby-1.9.2 у вас есть Base64.strict_encode64, который не добавляет, что \n (новая строка) в конце.
Ответ 3
Да, это вполне нормально. doc дает пример, демонстрирующий разделение строк. base64 делает то же самое и на других языках (например, Python).
Причина, по которой на этапе кодирования добавляются новые строки, добавляется, потому что base64 был первоначально разработан как механизм кодирования для отправки двоичного содержимого в электронной почте, где длина строки ограничена. Не стесняйтесь их заменять, если они вам не нужны.
Ответ 4
Кажется, их нужно раздеть/проигнорировать, например:
Base64.encode64(str).gsub(/\n/, '')
Ответ 5
Добавленный \n
при использовании Base64#encode64
верен, проверьте этот пост: https://glaucocustodio.github.io/2014/09/27/a-reminder-about-base64encode64-in-ruby/
Ответ 6
Используйте метод strict_encode64
. encode64
добавляет \n каждые 60 символов