od
나는 명령의 8진수 2바이트 출력이 무엇인지 알아내려고 노력 중입니다 . 나는 8진수 출력( -b
플래그)을 이해하지만 8진수 2바이트는 나에게 미스터리입니다( -o
).
-o
누군가 ASCII에서 결과를 계산하는 방법을 설명해 줄 수 있습니까 ?
예는 다음과 같습니다.
[root@localhost lpi103-2]# cat text1
1 apple
2 pear
3 banana
[root@localhost lpi103-2]# od -c text1
0000000 1 a p p l e \n 2 p e a r \n 3
0000020 b a n a n a \n
0000030
[root@localhost lpi103-2]# od -bc text1
0000000 061 040 141 160 160 154 145 012 062 040 160 145 141 162 012 063
1 a p p l e \n 2 p e a r \n 3
0000020 040 142 141 156 141 156 141 012
b a n a n a \n
0000030
[root@localhost lpi103-2]# od -oc text1
0000000 020061 070141 066160 005145 020062 062560 071141 031412
1 a p p l e \n 2 p e a r \n 3
0000020 061040 067141 067141 005141
b a n a n a \n
0000030
답변1
히스테리적인 역사적 이유로 인해 od
기본적으로 2바이트 단어가 인쇄됩니다.
숫자 020061(8진수)은 2바이트 시퀀스 1␣
( ␣
공백 문자)에 해당합니다. 왜? 16진수를 사용하면 더 명확해집니다. 0o20061 = 0x2031, 이는 ␣
ASCII에서는 0x20(32)이고 1
ASCII에서는 0x31(49)입니다. 낮은 비트(0x31)는 첫 번째 문자에 해당하고 높은 비트는 두 번째 문자에 해당합니다. od는 단어를 조합하는 것입니다.리틀 엔디안 방식순서는 시스템의 바이트 순서이기 때문입니다. ²
-c
한 출력 형식( )은 문자를 인쇄하고 다른 출력 형식( -o
)은 단어를 인쇄하므로 리틀 엔디안 순서는 덜 자연스럽습니다. 각 단어는 일반적인 숫자 형식으로 인쇄됩니다.빅엔디안 방식기호(왼쪽에서 오른쪽으로 읽음, 가장 중요한 숫자부터 읽음) 이는 숫자 출력에서 바이트 경계가 명확하게 표시되는 16진수에서 더욱 분명해집니다.
echo '1 text' | od -xc
0000000 2031 6574 7478 000a
1 t e x t \n\0
파일을 일련의 바이트로 보려면 이를 사용하십시오 od -t x1
(또는 hd
사용 가능한 경우).
사람이 진짜 사람이고, 컴퓨터가 진짜 컴퓨터이고, 숫자는 보통 8진수로 쓰여지고, 단어의 길이는 2바이트였던 시절이 있었습니다 .
²모든 PC(x86, x86-64)는 리틀 엔디안입니다.플라즈마 11유닉스가 시작된 곳. ARM CPU는 두 엔디안을 모두 처리할 수 있지만 Linux와 iOS는 이를 리틀 엔디안 모드에서 사용합니다. 따라서 오늘날 접할 수 있는 대부분의 플랫폼은 리틀 엔디안입니다.
답변2
흥미로운 질문입니다. 매뉴얼 페이지를 검색한 후 -o가 8진수 출력(od == 8진수 덤프)을 인쇄하고 추가한 c도 관련 문자만 인쇄한다는 것을 발견했습니다. -o만 사용하면 동일한 숫자가 제공됩니다.
출력을 보면 od는 한 번에 2바이트의 데이터를 읽습니다. 처음 두 문자를 예로 들어 보겠습니다.
CHAR - OCTAL - BINARY
1 061 0011 0001
SPACE 040 0010 0000
답은 이진 값을 연결하면 나옵니다(오른쪽은 "1", 왼쪽은 공백).
0010 0000 0011 0001
이 이진수 값을 8진수로 변환하면 od가 인쇄하는 020061이 됩니다.
자, 왜요? 요점은 od가 한 번에 2바이트를 읽고 그 2바이트가 실제로 두 개의 별도 문자라는 것을 신경 쓰지 않거나 알지 못한다는 것입니다.