Странно \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 в последней и 6-й позиции от конца. Декодер (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]
6 ответов
Изменить: так как я написал этот ответ Base64.strict_encode64()
был добавлен, который не добавляет новые строки.
Документы несколько сбивают с толку, b64encode
метод должен добавить новую строку для каждого 60-го символа, и пример для encode64
Метод на самом деле использует b64encode
метод.
Кажется pack("m")
метод для класса Array, используемый encode64
также добавляет новые строки. Я бы посчитал ошибкой дизайна, что это не обязательно.
Вы можете либо удалить символы новой строки самостоятельно, либо, если вы используете rails, есть ActiveSupport::CoreExtensions::Base64:: Кодирование с помощью encode64s
метод.
В ruby-1.9.2 у вас есть Base64.strict_encode64, который не добавляет этот \n (перевод строки) в конце.
Использование strict_encode64
метод. encode64
добавляет \n каждые 60 символов
Да, это вполне нормально. В документе приведен пример, демонстрирующий разделение строк. base64 делает то же самое и в других языках (например, Python).
Причина того, что новые строки без содержания добавляются на этапе кодирования, заключается в том, что base64 изначально была разработана как механизм кодирования для отправки двоичного содержимого в электронную почту, где длина строки ограничена. Не стесняйтесь заменить их, если они вам не нужны.
Кажется, они должны быть раздеты / проигнорированы, как:
Base64.encode64(str).gsub(/\n/, '')
\n
добавлено при использовании Base64#encode64
правильно, проверьте этот пост: https://glaucocustodio.github.io/2014/09/27/a-reminder-about-base64encode64-in-ruby/