3

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

当数据长度不足以适应格式时,如何使包在数据的开头添加零?

简短的常见问题解答

你想做什么? 我有一堆函数来处理不同类型的数据(floatshortlongushortulong等)。所有转换都使用pack/完成unpack。需要这些函数来转换第三方生成的数据。

为什么不使用octor 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

4

2 回答 2

4

您知道有一个将十六进制值转换为十进制的内置hex函数,不是吗?

$ 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 回答