将字节回显到文件


46

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

echo -n -e \x66\x6f\x6f > byteFileForNow

但是,当我使用nano而不是foo打开该文件时,我看到:

x66x6fx6f

因此,反斜杠被转义,但字节本身未转义。这次我也只在没有-e的情况下尝试了相同的操作,因此我希望可以看到\ x66 \ x6f \ x6f,但是与以前一样。

因此,echo转义了反斜杠,单独的反斜杠和反斜杠,无论是否应该这样做。
任何想法如何解决这个问题?
根据手册页,应该已经完成​​了我想要的工作。

Answers:


65

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

echo -n -e '\x66\x6f\x6f' > byteFileForNow

否则会导致shell替换\xx之前的内容echo -e

ps。双重逃逸也将起作用:

echo -n -e \\x66\\x6f\\x6f > byteFileForNow

我知道它可以使用引号,但可以使用双引号。我有点新,这很明显。谢谢!
2014年

请注意,因为echo通常是内置的shell命令。bash可以\xHH正确处理,但并非所有外壳都可以。
Ouki 2014年

5

贝壳

在外壳中,您可以使用printf

printf "%b" '\x66\x6f\x6f' > file.bin

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

佩尔

使用perl,它甚至更简单:

perl -e 'print pack("ccc",(0x66,0x6f,0x6f))' > file.bin

蟒蛇

如果您已安装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 

1
或者只是perl -e 'print pack "c*", 0x66, 0x6f, 0x6f'或者perl -e 'print pack "H*", "666f6f"'
斯特凡Chazelas

2
请注意,这printf %b '\x66'是不可移植的。printf '\x66'更具可移植性(可与一起使用ksh93,但仍不能与dashnor一起使用yash)。printf '\146\157\157'printf %b '\0146\0157\0157'便携式/标准。
斯特凡Chazelas

2

这可能不会直接回答问题,但是您也可以vi在十六进制模式下使用:

打开文件并键入: ESC :%!xxd切换到十六进制模式。

您将能够编辑十六进制部分(更改十六进制部分时,文本部分将不会更新)。

完成后,再次按Escape :%!xxd -r键,然后键入: ESC以回写您在十六进制模式下所做的更改(不要忘记以后保存)。


2

在线手册中有关每个命令的信息很多。在放弃并发布问题之前总是值得一看。

man echo说明允许的转义序列。这是摘录。

   If -e is in effect, the following sequences are recognized:

   \0NNN  the character whose ASCII code is NNN (octal)

   \\     backslash

   \a     alert (BEL)

   \b     backspace

   \c     produce no further output

   \f     form feed

   \n     new line

   \r     carriage return

   \t     horizontal tab

   \v     vertical tab

因此\ x86只是不正确。它必须是八进制的,并将字符串放在双引号中,否则它将由外壳程序解释。

例:

$ echo -e -n "\033\07\017" >tf
$ od -c tf
0000000 033  \a 017
0000003

编辑1

正如Ouki提醒我的那样,echo也是内置的shell,因此该信息在bash的手册页中man bash;这是相关的部分。但是,请在字符串两边使用引号 "来阻止外壳解释反斜杠。

   echo [-neE] [arg ...]
          Output  the  args, separated by spaces, followed by a newline.  The return status is always
          0.  If -n is specified, the trailing newline is suppressed.  If the  -e  option  is  given,
          interpretation  of  the  following  backslash-escaped characters is enabled.  The -E option
          disables the interpretation of these escape characters, even  on  systems  where  they  are
          interpreted  by  default.   The  xpg_echo shell option may be used to dynamically determine
          whether or not echo expands these escape characters by default.  echo does not interpret --
          to mean the end of options.  echo interprets the following escape sequences:
          \a     alert (bell)
          \b     backspace
          \c     suppress further output
          \e     an escape character
          \f     form feed
          \n     new line
          \r     carriage return
          \t     horizontal tab
          \v     vertical tab
          \\     backslash
          \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal dig
                 its)
          \xHH   the eight-bit character whose value is the hexadecimal value HH (one or two hex dig
                 its)

1
事情echo通常是内置命令。因此,这取决于您使用的外壳。linux默认为bash; \xHH通过其十六进制值正确显示字符。
Ouki 2014年

1
你是绝对正确的,我不好。查看我的编辑1更新。
X天
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.