TCL 中的零填充

zero padding in TCL

我的 tcl 代码如下所示:

set writes 1a8000028020900

binary scan [binary format H* $writes] B* bits
puts "$bits"

输出:

0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0

如果输入的十六进制值是偶数长度,则不会进行填充。如果它是奇数,就像上面的例子一样,零被填充。

如果格式化的位数没有在字节边界结束,则最后一个字节的剩余位将为零。 如何避免这种填充

manual 页面显示:

如果 arg 少于 count 个数字,则剩余数字将使用零。

您提供的值未指定全部 64 位。 binary 命令无法猜测您想要的内容,并在提供的字符串末尾填充零。

编辑:

为避免这种情况,只需定义要转换的值中的所有位即可:

set writes 01a8000028020900

If the number of digits formatted does not end at a byte boundary, the remaining bits of the last byte will be zeros. How to avoid this padding?

好吧,您将不得不计算并告诉 binary scan 目标位数。也许有比这更优雅的方式,但为什么不直接DIY呢?

% set writes 1a8000028020900
1a8000028020900
% set hexLength [string length $writes]
15
% binary scan [binary format H* $writes] B[expr {$hexLength * 4}] bits
1
% puts $bits
000110101000000000000000000000101000000000100000100100000000

这里有一个关于填充源字符串的想法:

binary scan [binary format H* $writes] B* bits
puts "$bits"

binary scan [binary format H* [format "%016s" $writes]] B* bits
puts "$bits"

产出

0001101010000000000000000000001010000000001000001001000000000000
0000000110101000000000000000000000101000000000100000100100000000