perl - 如何使 pack 从一开始就用零填充数据?

标签 perl hex pack

我正在使用 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 中完成。需要这些函数来转换第三方生成的数据。

为什么不使用 octhex 因为我必须处理有符号整数和 float 。我希望所有函数都相似,以便更好地理解代码。

您能提供更多示例吗?它们是:

示例 1: 有符号短整数(已收到完整数据)。系统从第三方接收十六进制数据 018F。此数据应该是 signed short,因此按以下方式处理:

print unpack "s", reverse pack "H4", "018F";
> 399

示例 2: 有符号短整数(收到一半数据)。系统从第三方接收十六进制数据 8F8F只有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/

相关文章:

c - 打印负十六进制

PHP 以大端字节顺序打包/解包 float

python - Python:如何从4字节字节数组中获取4字节大小的整数?

jar - 有关Gradle中脚本的一些问题

Perl 多线程 : '' forks '' vs ' 'threads'' in cross platforms scripts

Perl:不推荐使用哈希作为引用

java - 复制一个文件或多个文件形成一个 zip 文件,而无需使用 perl 或 java 实际解压缩它

Perlbrew 安装 perl 需要永远,只需安装已经编译的 perl

c - 从c中的文件中读取十六进制值

c - 如何将 uint8_t 值数组转换为 C 中的十六进制转储 char 字符串