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