我正在努力生成一些序列号,我需要以长格式编码它们,即标准的8字节,因为下游是Java应用程序,生成的数字应该由Java的Long
数据类型读取。
我搜索了Stack Overflow,我可以找到其他语言的答案,但不是Perl。
请注意,下面以ASCII格式打印8个字节:
$ perl -le ' BEGIN { printf("%08d\n", 256) } '
00000256
$
但我不希望这样。我希望输出的原始十六进制值为:
\x00 \x00 \x00 \x00 \x00 \x00 \x01 \x00
当被扫描为8字节时,Long
应再次变为256。
对于255,它应该是:
\x00 \x00 \x00 \x00 \x00 \x00 \x00 \xFF
怎么可以在Perl中完成?
pack()是你的朋友。
my $long = pack('Q', $value);
这将在原生的CPU字节序中创建一个64位,8字节,无符号整数,但是如果你想要一个特定的,即非原生的endian格式,在>
之后添加Q
将强制big-endian和<
将强制little-endian
请注意,这仅适用于64位处理器。
根据您的问题,您需要大端格式
my $long = pack('Q>', $value);
这会将256转换为"\x0\x0\x0\x0\x0\x0\x1\x0"
有关此有用功能的更多信息,请参阅perldoc pack
。