bash:如何以十六进制打印特定长度的整数
我试图以十六进制格式从一个文件中转储十进制整数值。 我确实有一个十进制整数值的文件bash:如何以十六进制打印特定长度的整数,bash,hex,printf,Bash,Hex,Printf,我试图以十六进制格式从一个文件中转储十进制整数值。 我确实有一个十进制整数值的文件 $ more test.dat_trim 2 9 0 -11 7 -17 14 -1 我正在尝试用十六进制打印这个整数。我还知道整数值足够小,可以容纳2个字节。我希望输出为2字节。但当我尝试时: declare -i i;for i in $(<test.dat_trim);do printf "%.2x\n" $i; done; 02 09 00 fffffffffffffff5 07 ffffffff
$ more test.dat_trim
2 9
0 -11
7 -17
14 -1
我正在尝试用十六进制打印这个整数。我还知道整数值足够小,可以容纳2个字节。我希望输出为2字节。但当我尝试时:
declare -i i;for i in $(<test.dat_trim);do printf "%.2x\n" $i; done;
02
09
00
fffffffffffffff5
07
ffffffffffffffef
0e
ffffffffffffffff
这意味着我希望负值仅在1字节上进行符号扩展。您是否尝试过printf(“%04x\n”,i)?打印带符号的十六进制值是不常见的,因此没有提供此功能的转换说明符 您可以使用以下解决方法:
for i in $(<test.dat_trim); do
if [ $i -ge 0 ]; then
printf " 0x%02x\n" $i;
else
printf "%c0x%02x\n" '-' $[$i * -1];
fi
done;
用这个
printf " 0x%02x\n" $[256 + $i];
但是,这仅适用于>=-256的数字。这可以在awk中完成,awk也可以处理负数:
awk '{printf "0x%x%s0x%x\n", $1, OFS, $2}' OFS='\t' file
0x2 0x9
0x0 0xfffffff5
0x7 0xffffffef
0xe 0xffffffff
有点傻,但见鬼:
xargs -a test.dat_trim bash -c 'printf %.2s\\n $(printf %02x\\n $* | rev) | rev' _
你试过了吗?这仍然会打印负值的补码。请解释一下-1示例的预期输出是什么?我的?OP正在寻找类似于
-0x01
的东西,我怀疑。我以为他希望它位于2个字节上,即4个字符的十六进制值。啊,是的,我还想知道输出是否位于2个字节上”,但从OPs示例“2个半字节”得出结论“的意思是。您应该通过为示例输入提供理想的输出来明确您期望的输出。参考更新:您为什么需要此更新,因为它会为-256
以及0
提供0
。对于-255以及1
等等,这是验证数据打包的子例程的一部分。基本上,解压二进制文件并用原始解压版本验证它们。还有另一个子程序检查数据量,例如,如果我们有256个字节,我将转储2个字节,而不是1.0x02 0x09 0x00-0x0b 0x07-0x11 0x0e-0x01 Almoust。但它是打印符号,而不是扩展负值的符号。符号应编码到符号扩展中。
awk '{printf "0x%x%s0x%x\n", $1, OFS, $2}' OFS='\t' file
0x2 0x9
0x0 0xfffffff5
0x7 0xffffffef
0xe 0xffffffff
xargs -a test.dat_trim bash -c 'printf %.2s\\n $(printf %02x\\n $* | rev) | rev' _