как представить n-байтовый массив длиной менее 2 * n символов - PullRequest
3 голосов
/ 19 октября 2010

, учитывая, что n-байтовый массив может быть представлен как 2 * n символьная строка с использованием шестнадцатеричного числа, есть ли способ представить n-байтовый массив менее чем 2 * n символов?

например, обычно целое число (int32) можно рассматривать как 4-байтовый массив данных

Ответы [ 7 ]

8 голосов
/ 19 октября 2010

Преимущество гексагона в том, что разбиение 8-битного байта на две равные половины - это самая простая вещь, которую вы можете сделать, чтобы сопоставить байт с печатными символами ASCII. Более эффективные методы рассматривают несколько байтов как блок:


Base-64 использует 64 символа ASCII для представления 6 битов одновременно. Каждые 3 байта (то есть 24 бита) разбиваются на 4 6-битовых base-64 цифры, где "цифры":

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

(и если ввод не кратен длине 3 байта, для дополнения в конце используется 65-й символ "="). Обратите внимание, что в некоторых вариантах формы base-64 используются разные символы для последних двух «цифр».


Ascii85 - это другое представление, которое несколько менее известно, но обычно используется: это часто способ, которым двоичные данные кодируются в файлах PostScript и PDF. При этом каждые 4 байта (с прямым порядком байтов) рассматриваются как целое число без знака, которое представляется как 5-значное число в базе 85, причем каждая цифра в базе 85 кодируется в виде кода ASCII 33 + n (то есть "!" для 0 , до "u" для 84) - плюс особый случай, когда можно использовать один символ "z" (вместо "!!!!!") для представления 4 нулевых байтов.

(Почему 85? Потому что 84 5 <2 <sup>32 <85 <sup>5 .)

4 голосов
/ 19 октября 2010

да, с использованием двоичного кода (в этом случае это занимает n байтов, что неудивительно), или с использованием любой базы, превышающей 16, общим является основание 64.

2 голосов
/ 19 октября 2010

Это может зависеть от точных чисел, которые вы хотите представить. Например, число 9223372036854775808, которое требует 8 байтов для представления в двоичном формате, занимает всего 4 байта в ascii, если вы используете произведение представления простых чисел (которое равно «2 ^ 63»).

1 голос
/ 24 октября 2010

Используя 65536 из примерно 90000 определенных символов Юникода, вы можете представить двоичную строку в N / 2 символов.

1 голос
/ 19 октября 2010

Base64 соответствует 6 битам в каждом символе, что означает, что 3 байта поместятся в 4 символа.

1 голос
/ 19 октября 2010

Как насчет base-64 ?

Все зависит от того, какие символы вы готовы использовать в своей кодировке (т.е. представление).

0 голосов
/ 19 октября 2010

Да.Используйте больше символов, чем просто 0-9 и аф.Один символ (в предположении 8-разрядного) может иметь 256 значений, поэтому вы можете представить n-байтовое число в n символов.

Если это необходимо для печати, вы можете просто выбрать набор символов для представленияразличные ценности.В этом случае хорошим вариантом является base-64.

...