바이트를 파일로 에코


46

i2c 버스를 사용하여 rasberry Pi를 일부 디스플레이에 연결하려고합니다. 시작하려면 물건, 특히 파일에 바이트를 수동으로 작성하고 싶었습니다. 파일에 특정 바이트를 어떻게 쓰나요? 나는 이미 그 것을 읽었고 내 문제가 다음과 같이 해결되어야한다고 생각했다.

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

그러나 foo 대신 nano로 해당 파일을 열면 다음과 같이 표시됩니다.

x66x6fx6f

따라서 백 슬래시는 이스케이프되었지만 바이트 자체는 이스케이프되지 않았습니다. 나는 또한 이번에 는 -e 없이 똑같이 시도 했으므로 \ x66 \ x6f \ x6f를 보려고 했지만 이전과 동일합니다.

따라서 echo는 백 슬래시, 백 슬래시 만 및 백 슬래시가 있어야하는지 여부에 관계없이 탈출합니다.
이 문제를 해결하는 방법에 대한 아이디어가 있습니까?
내가 찾고있는 것을 수행 해야하는 맨 페이지에 따르면.

답변:


65

코드를 따옴표로 묶어야합니다.

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

그렇지 않으면 쉘이 \x가기 x전에로 바뀝니다 echo -e.

추신. 이중 이스케이프도 작동합니다.

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

따옴표, 큰 따옴표로 작동하도록했습니다. 나는 다소 새로운 것이 분명했다. 감사!
Mark

echo는 일반적으로 내장 쉘 명령이므로주의하십시오. 제대로 bash다룰 \xHH수 있지만 모든 껍질이다는 것은 아닙니다.
Ouki

5

껍질

쉘에서는 다음을 사용할 수 있습니다 printf.

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

참고 : %b-백 슬래시 이스케이프를 해석하는 동안 관련 인수를 인쇄하십시오.

펄을 사용하면 훨씬 간단합니다.

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여전히 작동 하지만 여전히 작동 하지 dash않습니다 yash). printf '\146\157\157'또는 printf %b '\0146\0157\0157'휴대용 / 표준 일 것입니다.
Stéphane Chazelas 2016 년

2

이것은 질문에 직접 대답하지 않을 수도 있지만 vi16 진수 모드 에서도 사용할 수 있습니다 .

파일을 열고 ESC :%!xxd 를 입력하여 16 진 모드로 전환하십시오.

16 진 부분을 편집 할 수 있습니다 (16 진 부분을 변경해도 텍스트 부분은 업데이트되지 않습니다).

완료되면 escape를 다시 누른 다음 ESC:%!xxd -r 를 입력 하여 16 진 모드에서 수행 한 변경 사항을 다시 기록하십시오 (나중에 저장하는 것을 잊지 마십시오).


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은 잘못되었습니다. 8 진수 여야하며 문자열을 큰 따옴표로 묶어야합니다. 그렇지 않으면 쉘에서 해석됩니다.

예:

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

편집 1

Ouki가 나에게 상기 한 것처럼, echo는 또한 내장 쉘이므로 정보는 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일반적으로 내장 명령입니다. 따라서 이것은 사용중인 쉘에 달려 있습니다. 리눅스 기본값은 bash; \xHH16 진수 값을 통해 문자를 올바르게 표시합니다.
Ouki

1
당신은 절대적으로 정확합니다. 내 편집 1 업데이트를 참조하십시오.
X Tian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.