我正在使用 pack / unpack
在 perl 中将十六进制值转换为十进制值,如下所示:
print unpack "S", reverse pack "H4", "1230";
> 4656
数据是 4 个十六进制符号时一切正常。 如果数据长度不足以满足请求的格式包,则在末尾添加零。
像这样:
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
?
因为我必须处理有符号整数和 float 。我希望所有函数都相似,以便更好地理解代码。
您能提供更多示例吗?它们是:
示例 1: 有符号短整数(已收到完整数据)。系统从第三方接收十六进制数据 018F
。此数据应该是 signed short
,因此按以下方式处理:
print unpack "s", reverse pack "H4", "018F";
> 399
示例 2: 有符号短整数(收到一半数据)。系统从第三方接收十六进制数据 8F
。 8F
只有1个字节,而组成短整数需要2个字节。同样的处理方式:
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
的原因。
你现在如何处理它?</strong>我正在使用 sprintf 添加零。
print unpack "s", reverse pack "H4", sprintf "%04s", "8F";
> 143
您使用的是什么版本的 perl? 5.8.8
最佳答案
您知道有一个内置的 hex
函数可以将十六进制值转换为十进制,对吗?
$ perl -e 'print hex("123")'
291
关于perl - 如何使 pack 从一开始就用零填充数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12497243/