我有一個陣列,陣列中的每個專案都是 2 個數字的陣列,其值在 16 位范圍內。
對于陣列中的每個專案,我需要將這 2 個數字放在一個 32 位整數中,然后將其保存在 MySQL 資料庫的一個表中的一個型別的列中varbinary。
我想我需要使用packwith templateS!來創建一個 32 位整數,其中包含高/低 16 位中的其他 2 個數字。
我想我需要使用pack模板I!來創建要保存在資料庫中的最終值。
但我不確定我該如何做到這一點,pack而且我并不真正理解檔案中關于如何形成回圈的示例。
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 評論后更新:
- 32 位整數
- $number1 是高位
- 大端
@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
uj5u.com熱心網友回復:
關。
雙*標沒有意義。S!*S!*應該是S!*,S!S!或者S!2。
S!是錯的。那指的是一個unsigned int,它至少是 16 位,但它可以變化。您恰好需要 16 位,所以應該是S.
您也沒有指定位元組順序。由于您想要大端位元組順序,因此您實際上想要S>(or n)。
my $packed = pack( "S>2", $number1, $number2 ); # "\x00\x78\x0C\x12"
say sprintf "%v02X", $packed; # 00.78.0C.12
如您所見,這會生成一個由四個位元組組成的字串,而不是一個數字。但這就是你想要的。VARBINARY 用于存盤位元組序列。使用 using 解壓位元組串L>得到 32 位數字。
這帶來了另一種選擇。您還可以計算 32 位數字并將其打包。
my $packed = pack( "L>", $number1 << 16 | $number2 ); # "\x00\x78\x0C\x12"
say sprintf "%v02X", $packed; # 00.78.0C.12
參考:裝箱和拆箱編號的格式
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/537911.html
標籤:perl二进制整数盒
