변수를 리틀 엔디안에서 빅 엔디안으로 변환

변수를 리틀 엔디안에서 빅 엔디안으로 변환

Bash에서 작업하는 동안 리틀 엔디안에서 빅 엔디안으로 변환해야 하는 16진수 변수가 있습니다. 저는 이 개념을 처음 접했고 약 20분 전에 이에 대해 배웠으므로 공유해 주세요.

내 스크립트는 소수, 부호 있는 2의 보수, 8로 나누기 등 몇 가지 변경 사항을 적용하여 16진수 변수를 결정합니다.

다른 모든 것보다 먼저 리틀 엔디안에서 빅 엔디안으로의 변환을 거쳐야 합니다. (두 가지를 혼동할 수도 있지만 아래 예를 통해 명확하게 설명할 수 있습니다.)

예:

  1. 16진수 값: 0080 변환: 8000

  2. 16진수 값: 9800 변환: 0098

  3. 16진수 값: 1234 변환됨: 3412

나는 이것이 항상 4자리 숫자이기 때문에 16자리 16진수 변수라고 생각합니다.

답변1

16비트 값의 바이트 순서를 바꾸려면 2바이트를 바꿔야 합니다. 이는 단어에서 바이트를 분리하여 단어 내의 다른 비트 위치로 이동한 다음 다시 단일 단어로 결합하는 방식으로 분해될 수 있습니다.

특정 비트를 분리하려면 바이너리를 사용하십시오.그리고, &.사실, 한 피연산자의 비트는 x & 0 = 0다른 피연산자의 비트에 의해 주어진 합계를 갖습니다. 따라서 예를 들어 하위 4비트를 제공합니다.x & 1 = x10xab & 0x0f = 0x0b

이동하려면 Shift <<또는 를 사용하세요 >>. 예를 들어 0x0f << 4 = 0xf0.

이러한 값을 결합하려면 바이너리를 사용하세요.또는, |.예를 들어 0x30 | 0x07 = 0x37.

결합된 바이트 교환 은 다음 x과 같습니다 y.

l = x & 0x00ff             # isolate low byte
h = x & 0xff00             # isolate high byte
y = (l << 8) | (h >> 8)    # move and combine 

이러한 연산의 연산자는 많은 프로그래밍 언어에서 동일하며 C에서 상속됩니다. 여기에는 셸이 포함되지만 거기에는 산술 확장에 표현식을 넣어야 하므로 $(( ... )). (즉, 어쨌든 셸에서 이와 같은 작업을 수행하려는 경우 아마도 이를 수행하는 데 가장 좋은 도구는 아닐 것입니다.)

관련 정보