我正在尝试以十六进制格式从一个文件中转储十进制整数值。我确实有一个十进制整数值的文件。
$ 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 "%.2xn" $i; done;
02
09
00
fffffffffffffff5
07
ffffffffffffffef
0e
ffffffffffffffff
基本上printf "%.2xn"
它仅适用于正数。我怎样才能让它也适用于负数?只是为了澄清我的期望:结果应该是这样的:
02
09
00
f5
07
ef
0e
ff
这意味着我希望负值仅在 1 个字节上进行符号扩展。
打印有符号十六进制值并不常见,因此没有转换说明符提供此值。
您可以使用以下解决方法:
for i in $(<test.dat_trim); do
if [ $i -ge 0 ]; then
printf " 0x%02xn" $i;
else
printf "%c0x%02xn" '-' $[$i * -1];
fi
done;
将更新引用到问题:
只需替换此行
printf "%c0x%02xn" '-' $[$i * -1];
有了这个
printf " 0x%02xn" $[256 + $i];
但是,这仅适用于数字>= -256。
它可以在awk中完成,也可以处理负数:
awk '{printf "0x%x%s0x%xn", $1, OFS, $2}' OFS='t' file
0x2 0x9
0x0 0xfffffff5
0x7 0xffffffef
0xe 0xffffffff
<</div>
div class="one_answers"> 有点傻,但到底是什么:
xargs -a test.dat_trim bash -c 'printf %.2s\n $(printf %02x\n $* | rev) | rev' _
你试过 printf("%04x",i) 吗?