3

pack / unpack次のように16進値を10進値に変換するためにperlで使用しています:

print unpack "S", reverse pack "H4", "1230";
> 4656

データが 4 つの 16 進数シンボルである限り、すべてが良好です。データ長が要求されたフォーマットに収まらない場合、pack は最後にゼロを追加します。

このような:

print unpack "b*", pack "H4", "FF";
> 1111111100000000

それは以下を引き起こします:

print unpack "S", reverse pack "H4", "123";
> 4656

私はそれが同じであることを望みますがoct

print oct("0x123");
> 291

print unpack "S", reverse pack "H4", "0123";
> 291

データ長がフォーマットに収まらない場合、データの先頭にゼロを追加するパックを作成する方法は?

短いよくある質問

あなたは何をしようとしているのですか?floatさまざまなタイプのデータ(、、、、、など)shortを処理するための 関数がたくさんあります。すべての変換は/を使用して行われます。これらの関数は、サードパーティによって生成されたデータを変換するために必要です。longushortulongpackunpack

octまたはを使用しないのはなぜhexですか? 符号付き整数と浮動小数点数を処理する必要があるためです。また、コードの理解を深めるために、すべての関数を類似させたいと考えています。

もっと例を挙げていただけますか?どうぞ:

例 1:符号付き短整数 (完全なデータを受信)。018Fシステムはサードパーティから16 進データを受け取ります。このデータは であるはずなsigned shortので、次のように処理されます。

print unpack "s", reverse pack "H4", "018F";
> 399

例 2:符号付き短整数 (半分のデータを受信)。8Fシステムはサードパーティから16 進データを受け取ります。8F短い整数を形成するには 2 バイトが必要ですが、1 バイトしかありません。同じ方法で処理されます。

print unpack "s", reverse pack "H4", "8F";
> -28928

しかし、サードパーティはそうでは008Fありません8F00:

print unpack "s", reverse pack "H4", "008F";
> 143

print unpack "s", reverse pack "H4", "8F00";
> -28928

エンディアンはどうですか? すべての例で、受信したデータは ですがbig-endian、私のシステムはlittle-endianそれが使用されている理由reverseです。

今はどう対処していますか?sprintf を使用してゼロを追加しています。

print unpack "s", reverse pack "H4", sprintf "%04s", "8F";
> 143

どのバージョンの perl を使用していますか? 5.8.8

4

2 に答える 2

4

hex16 進値を 10 進値に変換する組み込み関数があることをご存知でしょうか。

$ perl -e 'print hex("123")'
291
于 2012-09-19T15:03:45.727 に答える
1

問題がエンディアンだけの場合は、解凍テンプレートで<and>修飾子を使用します。を参照してくださいperldoc -f pack。Perlの設計者は、これらの問題について無知ではありませんでした。

print unpack "s", reverse pack "H4", "008F";
> 143        (on little-endian system)

print unpack "s>", pack "H4", "8F";
> 143
于 2012-09-20T14:28:03.910 に答える