Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash:如何以十六进制打印特定长度的整数_Bash_Hex_Printf - Fatal编程技术网

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' _