Perl 如何使pack从一开始就用零填充数据?
我使用perl将十六进制值转换为十进制值,如下所示: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
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