我的 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,十六进制 7)时,它会在十六进制值之前打印出零。我添加了一点调试行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 的建议,因为我在与网络断开连接且对 CPAN 的访问受限(在工作中)的机器上使用 perl。
编辑
如果有人可以建议一种更好的方法来找到代表我的 TDO\TDI 二进制字符串的十六进制数的大小和\或者可以想出一个更好的想法来了解如何使用灵活的零填充而不是%0{$hexSize}
我很乐意听到的,特别是因为它可能会使问题无效。尽管我喜欢我的代码,但它不是天主教婚姻......
感谢所有帮助者和编辑。