我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
or hex
?
因为我必须处理有符号整数和浮点数。而且我希望所有功能都相似,以便更好地理解代码。
你能提供更多的例子吗?他们来了:
示例 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
使用的。
你现在怎么处理?我正在使用 sprintf 添加零。
print unpack "s", reverse pack "H4", sprintf "%04s", "8F";
> 143
你用的是什么版本的perl?5.8.8