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

时间:2014-02-13 15:13:29

标签: 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
ffffffffffffffef
0e
ffffffffffffffff

基本上printf "%.2x\n"它只适用于正数。我怎样才能让它对负面起作用呢? 只是为了澄清我的期望:结果应该是这样的:

02
09
00
f5
07
ef
0e
ff

意味着我希望负值仅在1个字节上进行符号扩展。

4 个答案:

答案 0 :(得分:1)

打印带符号的十六进制值并不常见,因此没有提供此功能的转换说明符。

您可以使用以下方法:

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 "%c0x%02x\n" '-' $[$i * -1];

用这个

printf " 0x%02x\n" $[256 + $i];

但是,这仅适用于数字&gt; = -256。

答案 1 :(得分:0)

它可以在awk中完成,它也处理负数:

awk '{printf "0x%x%s0x%x\n", $1, OFS, $2}' OFS='\t' file
0x2     0x9
0x0     0xfffffff5
0x7     0xffffffef
0xe     0xffffffff

答案 2 :(得分:0)

有点傻但是到底是什么:

xargs -a test.dat_trim bash -c 'printf %.2s\\n $(printf %02x\\n $* | rev) | rev' _

答案 3 :(得分:-1)

您是否尝试过printf(“%04x \ n”,i)?