bash:如何将十六进制整数打印到特定长度



我正在尝试以十六进制格式从一个文件中转储十进制整数值。我确实有一个十进制整数值的文件。

$ 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) 吗?

相关内容

  • 没有找到相关文章

最新更新