addr=0x30000000 echo -n -e "\x$(printf %08X $(($addr / 256)))\n"执行后输出的是300000,少了两位,为什么
时间: 2024-03-01 20:54:36 浏览: 28
这是因为`printf %08X $(($addr / 256))`输出的结果是一个8位十六进制数,而`$addr`除以256得到的结果是一个32位的十六进制数,如果直接使用`printf`输出,那么会自动截取前面的24位,只输出后面的8位。
因此,正确的做法是将`printf`输出的结果截取后8位,然后再将结果前面加上`\x`。修改后的代码如下:
```
addr=0x30000000
echo -n -e "\x${$(printf %08X $(($addr / 256)))[-8,-1]}\n"
```
`${$(printf %08X $(($addr / 256)))[-8,-1]}`表示将`$(printf %08X $(($addr / 256)))`的结果截取后8位,即保留倒数第8位到最后一位,然后使用`${...}`语法将结果作为字符串输出。
相关问题
echo -n -e "\\x$(printf %08X $(($addr / 256)))\n"会把addr=0x30000000输出成什么
`echo -n -e "\\x$(printf %08X $(($addr / 256)))\n"`这句代码会将`addr=0x30000000`输出成`\x30\x00\x00\x00\n`。
这里的`printf %08X $(($addr / 256))`是将`$addr`除以256并将结果格式化成8位十六进制数(不足8位在前面补0),得到`30000000`。然后在前面加上`\x`,就变成了`\x30\x00\x00\x00`。
最后通过`echo -e`命令将`\x30\x00\x00\x00`输出到终端,并在末尾加上一个换行符`\n`。`-n`选项表示不输出末尾的换行符。
想把addr=0x30000000完整输出出来,应该如何修改echo -n -e "\\x$(printf %08X $(($addr / 256)))\n"这句代码
如果你想要将`addr=0x30000000`完整输出,可以使用以下代码:
```
echo -n -e $(printf "%s" "$addr" | sed 's/0x/\\x/g')"\n"
```
这里使用了`sed`命令将`0x`替换为`\x`,然后使用`printf`命令将`addr`输出。