2013-05-15 2 views
3

나는 C#을 사용하여 이진 파일을 읽습니다. 파일 유형에 대한 명세에 따르면 바이트에 6 가지가 채워져 있다고합니다 [8]. 그러나 첫 번째 변수는 0-19 비트입니다. 두 번째 변수 20-39, 세 번째 40-59, 네 번째 60-62 및 63 비트는 부울입니다. 이 비트를 의미있는 데이터로 변환하려면 어떻게합니까? 이러한 모든 변수는 마지막 비트를 제외한 단위입니다.바이트 [8]에서 비트 [64] 파싱

+1

리틀 엔디안 또는 빅 엔디안? – Patashu

+0

Little Endian은 스펙에서 말하는 것입니다. – user2383945

답변

4

바이트가 귀하의 바이트라고 가정 해 봅시다 [8].

<< 왼쪽 피연산자의 비트를 이동 >> :의는 그 바이트 말을하자 첫 번째 비트 (http://en.wikipedia.org/wiki/Endianness)

0  1  2  3  4  5  6  7 
11111111 11111111 11112222 22222222 22222222 33333333 33333333 3333444B 

int first = bytes[0] << 12 + bytes[1] << 4 + (bytes[2] >> 4)&0xF; 
int second = (bytes[2]&0xF) << 16 + bytes[3] << 8 + bytes[4]; 
int third = bytes[5] << 12 + bytes[6] << 4 + (bytes[7] >> 4)&0xF; 
int fourth = (bytes[7] >> 1)&0x8; 
bool flag = bytes[7]&0x1 == 1 ? true : false; 

은 기본적으로 우리가 여기에서 두 가지 작업이 가장 중요하다 즉, 빅 엔디안 오른쪽 피연산자의 비트 수만큼 왼쪽 또는 오른쪽으로. 따라서 00101101 >> 4 = 0000001000101101 << 4 = 11010000

&0x?은 비트 마스크입니다. &은 모든 비트 쌍을 비교하며, 두 비트가 모두 1 인 경우에만 결과가 1이고 그렇지 않으면 0입니다. 마스크의 1은 전파가 허용되고 나머지는 지워집니다. 00101101&0xF = 0000110100101101&0x1 = 00000001

바이트 리틀 엔디안 인 경우 http://msdn.microsoft.com/en-us/library/6a71f45d(v=vs.71).aspx

것은 다음 비트 만지작가 다를 수 :

여기에 대한 C# 연산자를 읽고 (주 0xF입니다는 00,001,111이며, 0x1로는 00000001입니다).

+0

오 와우 감사합니다. 나는 처음에 int = (bytes [0] | bytes [1] >> 8) | (bytes [2] >> 16)) & 1048575; 그러나 당신의 말이 더 의미가 있습니다! – user2383945

+0

@ user2383945'bytes'의 비트 패킹이 당신이 생각하는 것인지 확인하십시오. 그렇지 않으면 논리가 달라집니다. – Patashu

+0

그래, 아직도 문제가있어 리틀 엔디안으로해야하기 때문에 문제라고 생각해. 비트를 뒤집어 야합니까? – user2383945

관련 문제