Может кто-нибудь объяснить, почему, как вычисляется результат для следующей распаковки?
"aaa".unpack('h2H2') #=> ["16", "61"]
В двоичном виде «a» = 0110 0001. Я не уверен, как «h2» может стать 16 (0001 0000) или «H2» может стать 61 (0011 1101).
Не 16 - он показывает 1, а затем 6. h дает шестнадцатеричное значение каждого клева, поэтому вы получаете 0110 (6), затем 0001 (1), в зависимости от того, является ли вы старшим или младшим битом смотря на. Сначала используйте высокий клев, и вы получите 61, что является шестнадцатеричным для 97 - значение 'a'
Ознакомьтесь с рубриком программирования ссылка при распаковке. Вот фрагмент кода:
Decodes str (который может содержать двоичный данные) в соответствии со строкой формата, возвращая массив каждого значения экстрагируют. Строка формата состоит последовательности из одного символа директивы, обобщенные в таблице 22.8 на странице 379. Каждая директива может быть сопровождаемый числом, указывающим количество раз повторить с этим директивы. Звездочка ("*") будет использовать все оставшиеся элементы. Директивы sSIILL могут быть выполнены подчеркиванием ("_"), чтобы использовать основной размер базовой платформы для указанный тип; в противном случае он использует независимый от платформы согласованный размер. Пробелы игнорируются в формате строка. Смотрите также Array # pack на странице 286.
И соответствующие символы из вашего примера:
H Извлекать шестнадцатеричные кусочки из каждого символа (самый значительный первый). h Извлечение шестнадцатеричных кусочков из каждого символа (сначала наименее значимого).
H Извлекать шестнадцатеричные кусочки из каждого символа (самый значительный первый).
h Извлечение шестнадцатеричных кусочков из каждого символа (сначала наименее значимого).
Шестнадцатеричный код символа a равен 61.
a
Шаблон h2 - это шестнадцатеричная строка (сначала низкий nybble), H2 - то же самое, что сначала high nibble.
h2
H2
Также см. Документацию perl .