say pack "A*", "asdf"; # Prints "asdf"
say pack "s", 0x41 * 256 + 0x42; # Prints "BA" (0x41 = 'A', 0x42 = 'B')
最初の行は理にかなっています: ASCII エンコードされた文字列を取得し、それを ASCII 文字列として文字列にパックしています。2 行目のパック形式は "\x42\x41" です。これは、私のマシンの短い整数のリトルエンディアン性のためです。
しかし、どういうわけか、2 行目のパックされた文字列を数値として扱うことができるはずだという気持ちを揺るがすことはできません。これは、Perl が数値をバイトのリトルエンディアン シーケンスとして格納する方法 (だと思います) からです。解凍せずに行う方法はありますか?pack() が返すものの正しいメンタル モデルを取得しようとしています。
たとえば、C では次のようにできます。
#include <stdio.h>
int main(void) {
char c[2];
short * x = c;
c[0] = 0x42;
c[1] = 0x41;
printf("%d\n", *x); // Prints 16706 == 0x41 * 256 + 0x42
return 0;
}