将字节回显到文件

Mar*_*ark 63 shell character-encoding echo quoting

我正在尝试使用 i2c 总线将我的 rasberry Pi 连接到某些显示器。首先,我想手动写入内容,特别是字节到文件。 如何将特定字节写入文件? 我已经读过那个,我认为我的问题应该通过这样的方式解决

echo -n -e \x66\x6f\x6f > byteFileForNow
Run Code Online (Sandbox Code Playgroud)

然而,当我打开了纳米该文件,而不是我看到:

x66x6fx6f

所以反斜杠被转义了,而不是字节本身。这次我也只在没有-e 的情况下尝试了相同的方法,所以我本来希望看到\x66\x6f\x6f,但结果和以前一样。

因此,echo 正在转义反斜杠、单独的反斜杠和反斜杠,而不管它是否应该这样做。
知道如何解决这个问题吗?
根据应该已经完成​​我正在寻找的手册页。

rus*_*ush 86

您必须将代码放入引号中:

echo -n -e '\x66\x6f\x6f' > byteFileForNow
Run Code Online (Sandbox Code Playgroud)

否则会导致外壳内容替换\xx它去之前echo -e

附:双转义也可以工作:

echo -n -e \\x66\\x6f\\x6f > byteFileForNow
Run Code Online (Sandbox Code Playgroud)


ken*_*orb 9

贝壳

在外壳中,您可以使用printf

printf "%b" '\x66\x6f\x6f' > file.bin
Run Code Online (Sandbox Code Playgroud)

注意:%b- 在解释反斜杠转义时打印相关参数。

珀尔

使用 perl,它甚至更简单:

perl -e 'print pack("ccc",(0x66,0x6f,0x6f))' > file.bin
Run Code Online (Sandbox Code Playgroud)

Python

如果您安装了 Python,请尝试以下单行:

python -c $'from struct import pack\nwith open("file.bin", "wb") as f: f.write(pack("<bbb", *bytearray([0x66, 0x6f, 0x6f])))'


测试:

$ hexdump file.bin 
0000000 66 6f 6f 
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`printf %b '\x66'` 不可移植。`printf '\x66'` 稍微更便携(与 `ksh93` 一起使用,仍然不能与 `dash` 或 `yash` 一起使用)。`printf '\146\157\157'` 或 `printf %b '\0146\0157\0157'` 将是可移植/标准的。 (2认同)