xxd -b
터미널 명령을 사용하여 파일의 바이너리를 볼 수 있다는 것을 읽었습니다 . 이 명령을 사용했는데 이진 파일이 표시되었지만 이진이 아닌 파일은 왼쪽에 줄 번호로 나열되고 이진이 아닌 파일은 오른쪽에 나열되었습니다. 컴퓨터가 파일을 읽을 때 파일의 바이너리를 읽고 해당 바이너리를 텍스트 편집기로 출력한 다음 텍스트 편집기에서 바이너리를 반환하고 싶습니다. 어떤 제안이 있으십니까? AppleScript를 사용하여 비슷한 작업을 수행할 수 있습니까?
답변1
컴퓨터가 파일을 읽는 것처럼 파일의 바이너리를 간단히 읽고 싶습니다.
이것은 실제로 불가능합니다. 어딘가에서 컴퓨터는 이를 두 가지 다른 전압 레벨로 읽습니다. 물론 사용자는 이를 볼 수 없습니다. 훨씬 느린 컴퓨터(오늘날 흔히 볼 수 있는 다중 GHz 컴퓨터가 아님)의 경우 고대역폭 오실로스코프를 연결하여거의컴퓨터처럼 보고/읽으세요. 그러나 그것은 전자공학에 관한 질문이고 확실히 유용한 대답은 아닙니다. 마지막으로,어느모니터에 표시되는 방식은 추상화입니다. 전자 장치가 실제로 매초 처리하는 수천억 또는 심지어 수조 개의 전압 변화를 직접 인식할 수 있는 방법은 없습니다.
이진 데이터를 편집하는 일반적인 방법은 16진수 편집기를 사용하여 16진수 데이터를 편집하는 것입니다. 16진수는 인간에게 더 쉽기 때문에(훨씬 더 짧음) 사용되지만 여전히 비트에 직접적인 대응을 갖고 있습니다. 16진수(0-9a-f)의 각 "니블"은 정확히 4비트를 나타냅니다. 이를 표시하는 전통적인 방법은 다음과 같은 방식으로 수행됩니다 xxd
. 편집 중인 바이너리 파일을 이해하는 데 필요한 거의 모든 것을 보여줍니다. 왼쪽에는 파일의 위치(오프셋)가 무엇인지, , 텍스트인 경우(바이너리 파일에서 일반적임) 중간에는 원시 바이너리 데이터(16진수로 표시됨)가 있습니다. xxd
이진 모드도 비슷하게 작동하지만 16진수 대신 비트를 사용합니다.
정말로 유용한 정보만 제거하려는 경우에는 xxd
16진수 모드( )를 선택할 수 있지만 -p
이진수 모드는 선택할 수 없습니다. 당신이 사용할 수있는 cut
:
$ echo 'Hello, world' | xxd -b | cut -c 11-63
01001000 01100101 01101100 01101100 01101111 00101100
00100000 01110111 01101111 01110010 01101100 01100100
00001010
또는 다음과 같이 포맷을 정말로 원하지 않는 경우:
perl -nE 'print unpack("B*", $_); END { print "\n"; }'
(반전으로 perl -nE 'print pack("B*", $_);'
)
그러나 바이너리 데이터를 이해하거나 편집하고 싶다면 16진수 편집기가 범용 도구에 가장 적합한 선택입니다.
그런데: 바이너리 → 텍스트 편집기 → 바이너리는 16진수 모드에서 쉽습니다 xxd -r
. 위의 Perl 조각은 바이너리에 대해 이 작업을 수행합니다.
$ echo 'Hello, world!' | perl -nE 'print unpack("B*", $_); END { print "\n"; }' | tee /dev/stderr | perl -nE 'print pack("B*", $_);'
0100100001100101011011000110110001101111001011000010000001110111011011110111001001101100011001000010000100001010
Hello, world!
나는 tee
그들 사이에 전달된 비트를 보여주기 위해 그것을 거기에 넣었습니다. 다음과 비교하여 얼마나 이해하기 어려운지 확인하십시오 xxd
.
$ echo 'Hello, world!' | xxd | tee /dev/stderr | xxd -r
00000000: 4865 6c6c 6f2c 2077 6f72 6c64 210a Hello, world!.
Hello, world!