5
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;
}
4

3 に答える 3

4

Perl がデータを内部に保存する方法に本当に興味がある場合は、PerlGuts Illustratedをお勧めします。しかし、通常、Perl ではそのような低レベルの詳細にアクセスできないため、そのようなことを気にする必要はありません。これらの内部構造は、C で XS 拡張機能を作成している場合にのみ重要です。

2 バイト文字列を C に「キャスト」したい場合は、次のような関数shortを使用できます。unpack

$ perl -le 'print unpack("s", "BA")'
16706
于 2013-10-17T10:41:05.833 に答える