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
を処理するための
関数がたくさんあります。すべての変換は/を使用して行われます。これらの関数は、サードパーティによって生成されたデータを変換するために必要です。long
ushort
ulong
pack
unpack
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