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

Perl 如何使pack从一开始就用零填充数据?,perl,hex,pack,Perl,Hex,Pack,我使用perl将十六进制值转换为十进制值,如下所示: print unpack "S", reverse pack "H4", "1230"; > 4656 当数据是4个十六进制符号时,一切都很好。 如果数据长度不足以满足请求的格式包,则在末尾添加零 像这样: print unpack "b*", pack "H4", "FF"; > 1111111100000000 它导致: print unpack "S", reverse pack "H4", "123"; > 46

我使用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
虽然我希望它与以下内容相同:

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

简短常见问题解答 你想做什么? 我有很多函数来处理不同类型的数据(
float
short
long
ushort
ulong
,等等)。所有转换都是使用
pack
/
unpack
完成的。这些函数用于转换第三方生成的数据

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

你能提供更多的例子吗?这里是:

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

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
endianness呢? 在所有示例中,接收的数据都是
big-endian
,而我的系统是
little-endian
,这就是为什么使用
reverse

您现在如何处理它?我正在使用sprintf添加零

print unpack "s", reverse pack "H4", sprintf "%04s", "8F";
> 143

你使用什么版本的perl?5.8.8

你知道有一个内置的
hex
函数可以将十六进制值转换为十进制值,是吗

$ perl -e 'print hex("123")'
291

如果问题只是endian ness,请在解包模板中使用
修饰符。 看见Perl的设计者并不是不知道这些问题:

print unpack "s", reverse pack "H4", "008F";
> 143        (on little-endian system)

print unpack "s>", pack "H4", "8F";
> 143

对我来说,这似乎是个好主意。你想干什么
printf(“%04d”,十六进制(“123”))
应该足够了。感谢您指出
XY问题
。我在问题中添加了简短的FAQ部分,以提供更多信息。希望现在更清楚。
hex
函数只能用于无符号整数(据我所知)。但我也要处理有符号整数。
print unpack "s", reverse pack "H4", "008F";
> 143        (on little-endian system)

print unpack "s>", pack "H4", "8F";
> 143