2016-05-05 2 views
0

У меня есть несколько двоичных данных, которые я хочу преобразовать в нечто более легко читаемое и скопированное/готовое.С Ruby, как преобразовать двоичные данные в сильно сжатые, но читаемые, формат

Двоичные данные показывает вверх, как этот

?Q?O?,???W%ʐ):?g???????? 

который довольно некрасиво. Я могу преобразовать его в hex с:

value.unpack("H*").first 

Но поскольку шестнадцатеричный код имеет только 16 символов, он не очень сжат. Я получаю строку длиной в сотни символов.

Я бы предпочел формат, который использует буквы (заглавные буквы и строчные буквы), цифры и основные символы, чтобы наилучшим образом использовать возможные значения. Что я могу использовать?

Я также предпочел бы что-то встроенное в Ruby, которое не требует другой библиотеки. К сожалению, я не могу требовать другую библиотеку, если она действительно хорошо известна и не популярна, или идеально встроена в Ruby.

Я попробовал материал от http://apidock.com/ruby/String/unpack и ничего не смог найти.

+0

Как вы начинаете чтение/загрузку двоичных данных? Каков источник данных (например, потоковая передача, например, входящая в сеть или статическая по длине, например, файл?)? Как вы выполняете рендеринг/вывод необработанных данных, чтобы они отображались как «? Q? O?»? W% ʐ) :? g ???????? '? –

ответ

1

Простой метод использует кодировку Base64 для кодирования значения. Он очень похож на Hex-кодирование (которое является Base16), но использует более длинный словарь.

Строки Base64, при правильной подготовке, содержат только печатные символы. Это преимущество для копирования/вставки и для совместного использования.

Второе преимущество заключается в том, что он имеет коэффициент кодирования 3: 4, что означает, что он достаточно эффективен. Коэффициент кодирования 3: 4 означает, что для каждого 3 байта на входе используются 4 байта для кодирования (75% эффективности); Hex-кодирование является менее эффективным коэффициентом кодирования 1: 2 или для каждого 1 байта ввода, для кодирования используются 50 байтов (50% эффективности).

Вы можете использовать стандартную библиотеку Ruby Base64 реализацию для кодирования и декодирования, например, так:

require "base64" 

encoded = Base64.encode64("Taste the thunder!") # <== "VGFzdGUgdGhlIHRodW5kZXIh\n" 
decoded = Base64.decode64(encoded)    # <== "Taste the thunder!" 

Обратите внимание, что есть (в основном) URL-безопасная версия, а также, так что вы можете включить закодированное значение в любом месте URL-адреса, не требуя дополнительной URL-кодировки. Это позволит вам пропускать информацию в URL-адресе неясным образом и, особенно, информацию, которая обычно не будет легко передаваться таким образом.

Попробуйте для кодирования данных:

encoded_url_param = Base64.urlsafe_encode64("cake+pie=yummy!") # <== "Y2FrZStwaWU9eXVtbXkh" 
decoded_url_param = Base64.urlsafe_decode64(encoded_url_param) # <== "cake+pie=yummy!" 

Использование Base64 в URL, в то время как на самом деле не «безопасности», поможет держать любопытных глаз от ваших данных и намерения. Единственным потенциальным недостатком использования значений Base64 в URL-адресе является то, что URL-адрес должен оставаться чувствительным к регистру, а некоторые приложения не соблюдают это требование. См. Вопрос Should URL be case sensitive SO для получения дополнительной информации.

1

Звуки для меня, как вы хотите базу 64. Она является частью стандартной библиотеки:

require 'base64' 
Base64.encode64(some_data) 

Или, используя пакет,

[some_data].pack("m") 

Полученные данные о 4/3 размер вход.

1

Кодирование строки Base36 является разумной альтернативой как Base64, так и Hex-кодированию. В этом методе кодирования используются только 36 символов, как правило, строчные буквы ASCII и номера ASCII.

Там не рубин API, что конкретно делает это, однако этот SO ответ Base36 Encode a String показывает, как сделать это эффективно в Ruby:

Кодирование в base36:

encoded = data.unpack('H*')[0].to_i(16).to_s(36) 

Декодирование из base36:

decoded = [encoded.to_i(36).to_s(16)].pack 'H*' 

Base36 кодировка будет хорошо работать при использовании в URL-адресах, аналогично Base64, однако она не чувствительна к проблемам чувствительности к регистру, которые Base 64 есть.

Обратите внимание, что кодировку строки Base36 не следует путать с целочисленным кодированием с базовым числом 36, которое просто преобразует целочисленное значение в соответствующую базовую кодировку 36. Целый метод использует String#to_i(36) и Fixnum#to_s(36) для достижения своих целей.