0

私は自分の perl で最も奇妙な動作をしていますが、理解していないようです。テキスト ファイルを解析して、途中でバイナリ文字列を作成しています。

$TDI = $a_stat . "$TDI"; #$a_stat = 0/1
if ( $b_stat ne "X" ) { $TDO = $b_stat . "$TDO" } #$b_stat is 0/1

今、サイズに応じてフォーマットして印刷したい:

$inputSize = length($TDI);  
$hexSize = sprintf("%.0f", ($inputSize/4)+0.4);  # rounding up
printf ("$inputSize TDI (%0${hexSize}X) TDO (%0${hexSize}X)\n", bin2dec $TDI, bin2dec $TDO);  

これは 32 ビットでは問題なく動作しますが、入力サイズを変更すると (具体的には入力 26、16 進 7)、16 進値の前にゼロが出力されます。少しデバッグ行を追加したprintf "$inputSize, $hexSize, (%0${hexSize}X)\n", oct($TDI)ところ、次の (非常に驚くべき) 結果が得 られました。

...  
24, 6, (0000AA)
25, 7, (00000000000000000000000000AA) <- 22 unneeded zeros  
26, 7, (00000000000000000000000000AA) <- 22 unneeded zeros  
27, 7, (00000000000000000000000000AA) <- 22 unneeded zeros  
28, 7, (00000000000000000000000000AA) <- 22 unneeded zeros  
29, 8, (000000AA)  
...
(now handling another string)  
25, 7, (0000000000000000000000000000000000000000000000000000000000000008) <- 56 unneeded zeros  
26, 7, (0000000000000000000000000000000000000000000000000000000000000008) <- 56 unneeded zeros  
27, 7, (0000000000000000000000000000000000000000000000000000000000000008) <- 56 unneeded zeros  
28, 7, (0000000000000000000000000000000000000000000000000000000000000008) <- 56 unneeded zeros  
29, 8, (00000008)
...  

次のループでは、121 個のゼロになり、さらに 5 ~ 8 の範囲に 30 個のゼロが追加されます。

bin2dec の結果を確認しましたが、問題ありません。

なぜこの異常が発生するのか、誰にもわかりませんか? 可能であれば、CPAN へのアクセスが制限された (仕事中の) ネットから切断されたマシンで perl を使用しているため、CPAN ベースの提案は控えるようにしてください。 誰かが私の TDO\ TDI バイナリ文字列を表す 16 進数のサイズを見つけるためのより良い方法を提案できるか、またはアジャイル ゼロ パディングを行う方法のより良いアイデアを思い付くことができれば
編集します。問題を無効にする可能性があるためです。私は自分のコードが好きですが、それはカトリックの結婚ではありません .ヘルパーと編集者の皆さんに感謝します.
%0{$hexSize}

4

1 に答える 1

0

問題が解決しました。

$これは、printfのローグが原因で発生した問題でした。

# bug                                            v
printf ("$inputSize TDI (%0${hexSize}X) TDO (%0${$hexSize}X)\n", bin2dec $TDI, bin2dec $TDO); 
printf ("$inputSize TDI (%0${hexSize}X) TDO (%0${hexSize}X)\n", bin2dec $TDI, bin2dec $TDO); 
# works                                          ^
于 2013-11-10T10:56:55.150 に答える