2010-04-14 2 views
6

바이트 단위로 파일을 읽습니다.비트 순서 지정 및 endianess

예를 들어 16 진수로 표시된 0x41 (0100 0001) 바이트가 있습니다.

이제이 바이트의 처음 세 비트, 즉 (010)을 원합니다.

비트 논리를 사용하여 처음 세 비트를 추출 할 수 있지만 제 질문은 처음 세 비트가 기계의 엔디안과 관계가 없습니까 (즉, 001이 될 수 없음)?

덕분에, 엔디안은 바이트 순서에 적용

+0

비트는 일반적으로 오른쪽에서부터 계산되므로 010은 예제에서 마지막 3 비트가됩니다. 나는 비트 조작에 관한 대부분의 문서가 최하위 비트 - 1, 2, 4, ...를 나타내는 비트가 첫 번째 비트라고 생각하기 때문에 이것을 언급합니다. –

+0

단어 내부의 비트 순서에는 보편적 인 규칙이 없습니다. 실제로는 사용하는 용도에 따라 다릅니다. 멀티 워드 연산을 수행하는 경우 자연 순서는 LSB 우선입니다. 그러나 TCP/IP 패킷에 대한 CRC를 계산할 때 MSB 우선이 더 적합합니다. – comingstorm

답변

7

또 다른 방법은 항목의 구성 요소를 개별적으로 읽을 수있을 때만 endianness를 적용하는 것입니다. 일반적으로 32 비트 정수의 개별 바이트를 메모리에서 독립적으로 읽을 수 있기 때문에 endianness를 적용해야합니다. 바이트를 32 비트 int로 사용하려면 아키텍처의 endianess를 고려해야합니다.

일반적으로 메모리의 개별 비트를 읽을 수 없으므로 메모리 아키텍처와 관련하여 '비트 엔디안'개념이 없습니다 (하드웨어 수준에서는 확실하지만 소프트웨어 수준에서 볼 수있는 것은 아닙니다).

  1. 비트 필드의 컴파일러를 저장하는 비트에 의존 컴파일러 (그리고 반드시 관련이없는 순서 : 당신이 처리해야 할 수도 있습니다 몇 가지 영역은 비트 엔디안 (또는 적어도 인식) 하드웨어 플랫폼의 endianess - 서로 다른 컴파일러가 동일한 플랫폼에서 비트 필드를 다르게 정렬 할 수 있습니다. 컴파일러는 char이 부호가 있거나 부호가 없도록 설정된 것과 비슷한 명령 행 옵션을 사용하여 한 방향으로 또는 다른 방법으로 구성 될 수 있습니다. . 그러나 C 비트 필드는 실제로 하드웨어 주소 지정과 아무 관련이 없습니다.

  2. 일부 하드웨어 아키텍처에서는 개별 비트 (예 : ARM Cortex M3)를 처리 할 수 ​​있으므로이 경우에는 해당 기능을 사용하려면 비트를 처리하기 위해 아키텍처가 어떻게 처리되는지 알아야합니다 .

  3. 직렬 링크를 통해 비트를 전송하는 경우 하드웨어 인터페이스는 일반적으로 최상위 비트 또는 최하위 비트가 먼저 와이어에서 '시프트 아웃'되는지 여부를 지정합니다.

7

, 않기 위해 비트. 비트의 순서는 해당 바이트 내에서 동일합니다.

3

예, 동일합니다.

바이트 내에서의 비트 정렬은 일반적으로 직렬 회선을 통해 전송되는 데이터 스트림을 읽을 때 비트 단위 I/O를 수행 할 때만 문제가됩니다. 실제로 한 번에 한 비트 씩 전송하므로 송신자와 수신자는 각 바이트에 대해 비트가 왼쪽에서 오른쪽 또는 오른쪽에서 왼쪽으로 전송되면 동의해야합니다.

파일 및 메모리 내 액세스의 경우 바이트 내부의 비트 순서가 변경되지 않습니다.

1

약간 혼란스러운 :-). 직렬 통신을 제외하고, "첫 번째 비트"라는 용어는 의미가 없으며 맨 왼쪽 (최상위) 비트와 맨 오른쪽 (최하위) 비트만 있습니다. 누군가가 "처음 3 비트"를 추출하라는 말을 한 다음에 그들에게 비난을주고 그들이 의미하는 바를 묻습니다. "비트 0"이라는 용어조차도 애매한 것으로 종종 가장 중요하지 않은 가장 오른쪽 비트 (2 ** 0 비트)를 의미하지만, 일부 비트 필드에서 가장 중요한 가장 왼쪽 비트를 의미하는 것처럼 자주 사용됩니다 .어느 비트가 "첫 번째"비트인지는 전적으로 비트로 무엇을하는지에 달려 있습니다.

1

C의 비트 연산자는 값인에서 작동하도록 정의됩니다. 0x41U >> 5이라는 표현식은 항상 값 2 (이진수는 010)를 제공합니다.

0

비트 순서는 필드가 바이트의 일부를 사용하거나 바이트를 통해 시작하거나 끝나는 바이트 (또는 둘 다)에 걸쳐있을 때 중요합니다.

예 : 데이터 2 바이트 먼저 235 (십진수) 초 173 (십진수), 일명 16 진수 EB 및 AD.

비트 필드는 4 번째 비트부터 시작하여 12 번째 비트까지를 원합니다. 따라서 3 비트를 건너 뛰고 다음 9 비트에서 9 비트 부호없는 정수를 만듭니다. I 데이터는 이들 4의 제 3 본

 
    byteOrder, bitOrder 

* bigEndian, bigEndian results in hex 0BA or decimal 186 
* littleEndian, littleEndian results in hex 1BD or decimal 445 
* littleEndian, bigEndian results in hex 05D or decimal 93 
* bigEndian, littleEndian results in hex 1DE or decimal 478 

: I 항

4 개 가능한 결과가있다. 크고 크고 작은 것은 운동하기가 쉽지 않습니다.

이 문제를 처리하기위한 힌트입니다.

바이트 순서가 빅 엔디안 인 경우 왼쪽에서 오른쪽으로 바이트를 적어 둡니다. 바이트 순서가 리틀 엔디안 인 경우 오른쪽에서 왼쪽으로 바이트를 적어 둡니다.