gpt4 book ai didi

perl - Perl 中的字节序列

转载 作者:行者123 更新时间:2023-12-02 18:00:44 24 4
gpt4 key购买 nike

我有一个数组,数组中的每一项都是由 2 个数字组成的数组,其值在 16 位范围内。
对于数组中的每一项,我需要将这 2 个数字放入 32 位整数中,然后将其保存在 MySQL 数据库表中 varbinary 类型的列中。

我想我需要使用 pack 和模板 S! 来创建一个 32 位整数,其中包含高/低 16 位中的其他 2 个数字。
我想我需要将 pack 与模板 I! 一起使用来创建要保存在数据库中的最终值。
但我不确定如何使用 pack 做到这一点,而且我不太理解 doc 中的示例。关于如何形成循环。

my( $ip, $cs,
$flags,$fl,$fh,
$ax,$al,$ah, $bx,$bl,$bh, $cx,$cl,$ch, $dx,$dl,$dh,
$si, $di, $bp, $ds, $es ) =
unpack( 'v2' . ('vXXCC' x 5) . 'v5', $frame );

有人可以帮助我如何使用pack来实现这个吗?或者 pack 不是这两种情况的正确解决方案?

例如,要创建一个 32 位数字,请使用以下代码片段:

my $number1 = 120;
my $number2 = 3090;
my $word = pack( 'S!*S!*', $number1, $number2 );
print "$word \n";

打印:x

我期望它会打印 1 个数字(32 位整数)。我在这里做错了什么/误解了什么?

@ikegami 评论后更新:

  1. 32 位整数
  2. $number1 是高位
  3. 大尾数

@ikegami 评论后更新 2。我尝试了以下方法:

my @array = (
[120, 3090],
[34, 2018],
[47, 4005],
[98, 2345],
[111, 1]
);

my @packed;
foreach ( @array ) {
my @elem = $_;
print $elem[0][0]. " - ". $elem[0][1]. "\n";
my $id = $elem[0][0];
my $num = $elem[0][1];
my $word = pack( 'S>2', $id, $num);
push @packed, $word;
say sprintf "%v02X", $word;
}

my $packed_output = pack('I*', @packed); // line 63
say sprintf "%v02X", $packed_output;

失败并打印以下内容:

00.78.0C.12
120 - 3090
00.78.0C.12
34 - 2018
00.22.07.E2
47 - 4005
00.2F.0F.A5
98 - 2345
00.62.09.29
111 - 1
00.6F.00.01
Argument "\0x\f^R" isn't numeric in pack at line 63.
Argument "\0"^G?" isn't numeric in pack at line 63.
Argument "\0/^O?" isn't numeric in pack at line 63.
Argument "\0b^I)" isn't numeric in pack at line 63.
Argument "\0o\0^A" isn't numeric in pack at line 63.
00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00

最佳答案

关闭。

*没有任何意义。 S!*S!* 应为 S!*S!S!S!2

S! 是错误的。它指的是 unsigned int,它至少为 16 位,但可能会有所不同。您想要正好 16 位,所以应该是 S

您也没有指定字节顺序。由于您想要大尾字节顺序,因此您实际上需要 S> (或 n)。

my $packed = pack( "S>2", $number1, $number2 );  # "\x00\x78\x0C\x12"

say sprintf "%v02X", $packed; # 00.78.0C.12

如您所见,这会生成一个四个字节的字符串而不是一个数字。但这就是你想要的。 VARBINARY 用于存储字节序列。使用 L> 解压字节字符串即可获取 32 位数字。

这提出了一个替代方案。您还可以计算 32 位数字并将其打包。

my $packed = pack( "L>", $number1 << 16 | $number2 );  # "\x00\x78\x0C\x12"

say sprintf "%v02X", $packed; # 00.78.0C.12

引用:Formats for Packing and Unpacking Numbers

关于perl - Perl 中的字节序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74510683/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com