od에서 8진수 2바이트 출력을 계산하는 방법

od에서 8진수 2바이트 출력을 계산하는 방법

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)이고 1ASCII에서는 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바이트가 실제로 두 개의 별도 문자라는 것을 신경 쓰지 않거나 알지 못한다는 것입니다.

관련 정보