我正在嘗試創建一個 12 位元組的標頭,并且正在使用 pack。一切都很棒,直到我需要在 pack 函式中包含一個遞增值..
編輯:
我有一個打開的 ffmpeg 管道,我正在從中捕獲輸出。捕獲的資料將成為有效負載,將被加密并附加到標頭的末尾。我的回圈不是 for 回圈,但我想我會讓讀者更容易理解。
所以讓我在這里更新這個問題,希望它能消除任何困惑。如果我需要提供更多資訊,請告訴我。
my $m = 00;
my $n = 00;
while( <$source_audio> ) {
if(($n % 16) == 0){
$m ; #this should increment when n reaches 0xff
}
my $header = pack( 'C C n n C*', 0x80, 0x78, $m, $n, 0x12, 0x34, 0x98, 0x76, 0x01, 0x02, 0x03, 0x04 );
print $file $header ;
$n ;
}
我只需要能夠打包 $m 和 $n 就可以得到預期的輸出:
80 78 00 01 12 34 98 76 01 02 03 04
80 78 00 02 12 34 98 76 01 02 03 04
80 78 00 03 12 34 98 76 01 02 03 04
80 78 00 04 12 34 98 76 01 02 03 04
80 78 00 05 12 34 98 76 01 02 03 04
... iterating 0x0000 to 0xFFFF ...
80 78 FF FB 12 34 98 76 01 02 03 04
80 78 FF FC 12 34 98 76 01 02 03 04
80 78 FF FD 12 34 98 76 01 02 03 04
80 78 FF FE 12 34 98 76 01 02 03 04
80 78 FF FF 12 34 98 76 01 02 03 04
編輯2:
這給了我想要的輸出,但我得到了嚴格和啟用警告的錯誤:
my $m = 0x00;
my $n = 0x00;
my $message = "this";
while ( <$source_audio> ) {
my $header = pack('C*', 0x80, 0x78, $m, $n, 0x12, 0x34, 0x98, 0x76, 0x01, 0x02, 0x03, 0x04);
if(($n % 0xFF) == 0 and $n != 0x00){
$m ;
}
$n ;
print $temp $header;
}
Character in 'C' format wrapped in pack
解決方案正如 ikegami 指出的那樣:
pack('C C n C*', 0x80, 0x78, $n, 0x12, 0x34, 0x98, 0x76, 0x01, 0x02, 0x03, 0x04);
uj5u.com熱心網友回復:
該問題與您對它的使用無關pack。問題是您計算錯誤$m并且$n. 警告是$m超出的結果0xFF,這顯然不應該發生。
以下正確計算$mand $n(我將其重命名為$hi,$lo原因很快就會變得顯而易見):
my $hi = 0x00;
my $lo = 0x00;
while ( <$source_audio> ) {
my $header = pack( 'C*',
0x80, 0x78, $hi, $lo, 0x12, 0x34, 0x98, 0x76, 0x01, 0x02, 0x03, 0x04 );
...
if ( $lo == 0xFF ) {
$lo = 0;
$hi;
} else {
$lo;
}
}
這也可以寫成:
$lo = ( $lo 1 ) & 0xFF;
$hi if !$lo;
但我們實際上只是增加一個存盤在兩個八位位元組中的數字。
my $n = 0;
while ( <$source_audio> ) {
my $hi = $n >> 8;
my $lo = $n & 0xFF;
my $header = pack( 'C*',
0x80, 0x78, $hi, $lo, 0x12, 0x34, 0x98, 0x76, 0x01, 0x02, 0x03, 0x04 );
...
$n;
}
但是讓我們把包裝留給pack!我們正在嘗試使用 big-endian 位元組順序將該值存盤為 16 位無符號整數。咨詢包裝和拆包號碼格式或我們可以使用的節目的檔案packS>或n.
my $n = 0;
while ( <$source_audio> ) {
my $header = pack( 'C C n C*',
0x80, 0x78, $n, 0x12, 0x34, 0x98, 0x76, 0x01, 0x02, 0x03, 0x04 );
...
$n;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/488109.html
