Как работает string.unpack в Ruby? - PullRequest
       11

Как работает string.unpack в Ruby?

12 голосов
/ 25 сентября 2008

Может кто-нибудь объяснить, почему, как вычисляется результат для следующей распаковки?

"aaa".unpack('h2H2')               #=> ["16", "61"]

В двоичном виде «a» = 0110 0001. Я не уверен, как «h2» может стать 16 (0001 0000) или «H2» может стать 61 (0011 1101).

Ответы [ 3 ]

9 голосов
/ 25 сентября 2008

Не 16 - он показывает 1, а затем 6. h дает шестнадцатеричное значение каждого клева, поэтому вы получаете 0110 (6), затем 0001 (1), в зависимости от того, является ли вы старшим или младшим битом смотря на. Сначала используйте высокий клев, и вы получите 61, что является шестнадцатеричным для 97 - значение 'a'

6 голосов
/ 25 сентября 2008

Ознакомьтесь с рубриком программирования ссылка при распаковке. Вот фрагмент кода:

Decodes str (который может содержать двоичный данные) в соответствии со строкой формата, возвращая массив каждого значения экстрагируют. Строка формата состоит последовательности из одного символа директивы, обобщенные в таблице 22.8 на странице 379. Каждая директива может быть сопровождаемый числом, указывающим количество раз повторить с этим директивы. Звездочка ("*") будет использовать все оставшиеся элементы. Директивы sSIILL могут быть выполнены подчеркиванием ("_"), чтобы использовать основной размер базовой платформы для указанный тип; в противном случае он использует независимый от платформы согласованный размер. Пробелы игнорируются в формате строка. Смотрите также Array # pack на странице 286.

И соответствующие символы из вашего примера:

H Извлекать шестнадцатеричные кусочки из каждого символа (самый значительный первый).

h Извлечение шестнадцатеричных кусочков из каждого символа (сначала наименее значимого).

2 голосов
/ 25 сентября 2008

Шестнадцатеричный код символа a равен 61.

Шаблон h2 - это шестнадцатеричная строка (сначала низкий nybble), H2 - то же самое, что сначала high nibble.

Также см. Документацию perl .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...