Встроенная библиотека 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 в последнем и 6-м положении от конца. Декодер (Base64.decode64) возвращает назад старую строку отлично. Странная вещь, они, \n не добавляет значения к закодированной строке. Когда я удаляю новые строки из выходной строки, декодер декодирует ее снова отлично.
irb(main):005:0> Base64.decode64(Base64.encode64(str).gsub("\n", '')) == str
=> true
Больше из этого, я пользовался другой библиотекой JS для создания закодированного вывода base64 той же входной строки, вывод прибывает без \n.
Действительно ли это - ошибка или что-либо еще? Кто-либо столкнулся с этой проблемой прежде?
К ВАШЕМУ СВЕДЕНИЮ,
$ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
Изменить: Поскольку я написал этот ответ, был добавлен Base64.strict_encode64 ()
, который не добавляет новые строки.
Документы несколько сбивают с толку, метод b64encode
должен добавлять новую строку для каждого 60-го символа, а в примере для метода encode64
фактически используется метод b64encode
.
Похоже, что метод pack ("m")
для класса Array, используемого encode64
, также добавляет новые строки. Я считаю ошибкой дизайна то, что это не является обязательным.
Вы можете удалить символы новой строки самостоятельно или, если вы используете rails, использовать ActiveSupport :: CoreExtensions :: Base64 :: Encoding с методом encode64s
.
Ага, это нормально. В документе приведен пример, демонстрирующий разделение строк. base64 делает то же самое и на других языках (например, Python).
Причина, по которой новые строки без содержимого добавляются на этапе кодирования, заключается в том, что base64 изначально был разработан как механизм кодирования для отправки двоичного содержимого по электронной почте, где длина строки ограничена. Не стесняйтесь заменить их, если они вам не нужны.