Perl pack / unpack и длина двоичной строки - PullRequest
2 голосов
/ 30 ноября 2011

Рассмотрим этот короткий пример:

$a = pack("d",255);
print length($a)."\n";
# Prints 8

$aa = pack("ddddd", 255,123,0,45,123);
print length($aa)."\n";
# Prints 40

@unparray = unpack("d "x5, $aa);
print scalar(@unparray)."\n";
# Prints 5

print length($unparray[0])."\n"
# Prints 3

printf "%d\n", $unparray[0] '
# Prints 255

# As a one-liner:
# perl -e '$a = pack("d",255); print length($a)."\n"; $aa = pack("dd", 255,123,0,45,123); print length($aa)."\n"; @unparray = unpack("d "x5, $aa); print scalar(@unparray)."\n"; print length($unparray[0])."\n"; printf "%d\n", $unparray[0] '

Теперь я ожидаю, что число с плавающей запятой двойной точности будет восемь байтов, поэтому первое length($a) является правильным. Но почему длина после распаковки (length($unparray[0])) сообщает 3 - когда я пытаюсь вернуться точно так же (двойная точность, т.е. восемь байтов) - и значение элемента (255) правильно сохраняется

1 Ответ

5 голосов
/ 30 ноября 2011

Распаковав то, что вы упаковали, вы получили исходные значения, а первое значение - 255. Строковое значение 255 - это «255», что составляет 3 символа, и это то, что length говорит вам.

...