echo -ne "\x55\xAA"与echo -ne "55AA"
时间: 2023-06-30 12:26:15 浏览: 81
这两个命令的作用是不同的。
- echo -ne "\x55\xAA" 的作用是输出两个十六进制数(0x55 和 0xAA)所对应的 ASCII 字符,即输出两个字符:U 和 ª。其中,\x 是转义字符,用于表示后面所跟的数值是十六进制数。
```
$ echo -ne "\x55\xAA"
Uª$
```
- 而 echo -ne "55AA" 的作用是输出一个字符串 "55AA" 所对应的 ASCII 字符,即输出四个字符:'5'、'5'、'A'、'A'。因为没有使用任何转义字符,所以不会将其解析为十六进制数。
```
$ echo -ne "55AA"
55AA$
```
因此,这两个命令的作用是不同的。
相关问题
start_addr=0x30000000 end_addr=0x30000003 data_write=0x55AA55AA count=0 match_count=0 # 写入数据 for ((addr=$start_addr; addr<$end_addr+1; addr=addr+1)); do # echo "addr: $addr" #echo -n -e "\\x$(printf %08X $(($addr / 256)))\n" echo "addr=$(printf '%X' $addr)" echo -ne "\x55\xAA\x55\xAA" | dd of=/dev/mem bs=4 count=1 seek=$(($addr/8)) conv=notrunc 2>/dev/null data=$(echo -ne "\x55\xAA\x55\xAA" | hexdump -e '/4 "%08x\n"') data_text=$(echo -ne "\x55\xAA\x55\xAA" | hexdump -e '/4 "%08x\n"' | sed 's/../& /g') echo "data_text: $data_text" #echo "data: $data" data_read=$(dd if=/dev/mem bs=4 count=1 skip=$(($addr/4)) 2>/dev/null | hexdump -e '/4 "%08x\n"') data_read_text=$(dd if=/dev/mem bs=4 count=1 skip=$(($addr/4)) 2>/dev/null | hexdump -e '/4 "%08x\n"' | sed 's/../& /g') echo "data_read_text: $data_read_text" # echo "data_read: $data_read" if [ "$data_read" == "$data" ]; then match_count=$((match_count+1)) echo "match_count: $match_count" fi count=$((count+1)) echo "count: $count" done # 输出结果 # 判断结果 if [ $match_count -eq $count ]; then echo "PASS" else echo "FAIL" fi判断结果输出为PASS,但是data_read_text输出空白,应该如何解决
在/dev/mem设备中读写内存需要root权限,如果你没有足够的权限,可能会导致读写失败并且无法输出数据。请确保你使用root权限运行脚本或者已经获得了足够的权限。
另外,你在 dd 命令中设置的 bs 参数应该为 8 而不是 4。因为你的数据宽度是 32 位,每个地址应该占用 8 个字节,而不是 4 个字节。修改 bs 参数后重新运行脚本,看看是否能够正确输出数据。
最后,你可以使用 xxd 命令来代替 hexdump 命令,因为 xxd 命令在输出十六进制数据时更为简洁。例如:
```
data_text=$(echo -ne "\x55\xAA\x55\xAA" | xxd -p -c 4)
```
这将输出 "55aa55aa",其中 -p 参数表示输出为纯十六进制字符串,而 -c 4 参数表示每行输出 4 个字节的数据。
综上所述,以下是修改后的脚本:
```
start_addr=0x30000000
end_addr=0x30000003
data_write=0x55AA55AA
count=0
match_count=0
# 写入数据
for ((addr=$start_addr; addr<$end_addr+1; addr=addr+8)); do
echo "addr=$(printf '%X' $addr)"
echo -ne "\x55\xAA\x55\xAA" | dd of=/dev/mem bs=8 count=1 seek=$(($addr/8)) conv=notrunc 2>/dev/null
data_text=$(echo -ne "\x55\xAA\x55\xAA" | xxd -p -c 4)
echo "data_text: $data_text"
data_read_text=$(dd if=/dev/mem bs=8 count=1 skip=$(($addr/8)) 2>/dev/null | xxd -p -c 4)
echo "data_read_text: $data_read_text"
if [ "$data_read_text" == "$data_text" ]; then
match_count=$((match_count+1))
echo "match_count: $match_count"
fi
count=$((count+1))
echo "count: $count"
done
# 输出结果
if [ $match_count -eq $count ]; then
echo "PASS"
else
echo "FAIL"
fi
```
希望这能够帮助你解决问题。
start_addr=0x30000000 end_addr=0x30000003 data_write=0x55AA55AA count=0 match_count=0 # 写入数据 for ((addr=$start_addr; addr<$end_addr+1; addr=addr+1)); do echo -ne "\x55\xAA\x55\xAA" | dd of=/dev/mem bs=4 count=1 seek=$(($addr/8)) conv=notrunc 2>/dev/null data=$(echo -ne "\x55\xAA\x55\xAA" | hexdump -e '/4 "%08x\n"') echo "data: $data" data_read=$(dd if=/dev/mem bs=4 count=1 skip=$(($addr/4)) 2>/dev/null | hexdump -e '/4 "%08x\n"') echo "data_read: $data_read" if [ "$data_read" == "$data" ]; then match_count=$((match_count+1)) echo "match_count: $match_count" fi count=$((count+1)) echo "count: $count" done # 输出结果 # 判断结果 if [ $match_count -eq $count ]; then echo "PASS" else echo "FAIL" fi 为什么这段代码data和data_read输出的都是空白?
这段代码中,数据写入和读取操作都使用了`dd`命令和`hexdump`命令。但是,`dd`命令和`hexdump`命令都是用于二进制数据的传输和显示,而不是文本数据。因此,如果想要在终端中查看二进制数据,需要使用`xxd`命令或者`od`命令。所以,将`hexdump`命令替换成`xxd`命令或者`od`命令即可输出正确的数据。
修改后的代码如下:
```
start_addr=0x30000000 end_addr=0x30000003 data_write=0x55AA55AA count=0 match_count=0
# 写入数据
for ((addr=$start_addr; addr<$end_addr+1; addr=addr+1)); do
echo -ne "\x55\xAA\x55\xAA" | dd of=/dev/mem bs=4 count=1 seek=$(($addr/8)) conv=notrunc 2>/dev/null
data=$(echo -ne "\x55\xAA\x55\xAA" | xxd -p)
echo "data: $data"
data_read=$(dd if=/dev/mem bs=4 count=1 skip=$(($addr/4)) 2>/dev/null | xxd -p)
echo "data_read: $data_read"
if [ "$data_read" == "$data" ]; then
match_count=$((match_count+1))
echo "match_count: $match_count"
fi
count=$((count+1))
echo "count: $count"
done
# 判断结果
if [ $match_count -eq $count ]; then
echo "PASS"
else
echo "FAIL"
fi
```