Странно \ n в кодировке base64 в Ruby - PullRequest
134 голосов
/ 12 апреля 2010

Встроенная библиотека 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 ]

182 голосов
/ 12 апреля 2010

Редактировать: С тех пор, как я написал этот ответ, был добавлен Base64.strict_encode64(), который не добавляет новые строки.


Документы несколько сбивают с толку, предполагается, что метод b64encode добавляет новую строку для каждого 60-го символа, а в примере для метода encode64 фактически используется метод b64encode.

Похоже, что метод pack("m") для класса Array, используемого encode64, также добавляет символы новой строки. Я бы посчитал ошибкой дизайна, что это не является обязательным.

Вы можете удалить символы перевода строки самостоятельно, или, если вы используете rails, есть ActiveSupport :: CoreExtensions :: Base64 :: Encoding с помощью метода encode64s.

103 голосов
/ 13 января 2011

В ruby-1.9.2 у вас есть Base64.strict_encode64, который не добавляет этот \ n (перевод строки) в конце.

9 голосов
/ 12 апреля 2010

Да, это вполне нормально. doc дает пример, демонстрирующий разделение строк. base64 делает то же самое и в других языках (например, Python).

Причина, по которой новые строки без содержимого добавляются на этапе кодирования, заключается в том, что base64 изначально была разработана как механизм кодирования для отправки двоичного содержимого в электронную почту, где длина строки ограничена. Не стесняйтесь заменить их, если они вам не нужны.

4 голосов
/ 22 февраля 2013

Кажется, они должны быть раздеты / проигнорированы, как:

Base64.encode64(str).gsub(/\n/, '')
2 голосов
/ 29 октября 2015

\n добавлено при использовании Base64#encode64 правильно, проверьте этот пост: https://glaucocustodio.github.io/2014/09/27/a-reminder-about-base64encode64-in-ruby/

0 голосов
/ 01 февраля 2018

Использовать strict_encode64 метод. encode64 добавляет \ n каждые 60 символов

...