2011-03-14 3 views
1

비트 마스크를 사용하여 정보에 대한 바이너리 파일을 검사 (모호한 업무 특성에 편집) :나는 다음과 같은 프로그래밍 작업이 부여 된

는 원시 (바이너리) 파일 (단계 II 구현을 위해 필요) 심문 할 수있다 꼬투리가 있는지 감지 할 수 있습니다. 형식은 파일의 원본 (FormatX와 FormatY)에 따라 다릅니다. 16 비트의 워드 크기를 사용하여 다음 비트 마스크는 파일에서 포드의 존재를 확인하는 데 사용할 수 있습니다 : 내 로컬 파일 시스템에서 파일이 : 나는 지금까지이 문제에 접근 한 방법

Word # Mask Value Indicates 
1  0xFF00 0x8700 Little Endian (Format X) 
1  0x00FF 0x0087 Big Endian (Format Y) 
13  0x0200 0x0200 right pod installed (Format X) 
13  0x0002 0x0002 right pod installed (Format Y) 
13  0x0100 0x0100 left pod installed (Format X) 
13  0x0001 0x0001 left pod installed (Format Y) 

그래서 System.IO.File.OpenRead를 사용하여이를 Stream 객체로 가져옵니다. 한 번에 16 비트/2 바이트 스트림을 통해 읽고 싶습니다. 이 크기의 첫 번째 "단어"의 경우, 내가 처리 할 형식을 감지하기 위해 비트 마스크를 적용 해 봅니다. 그런 다음 13 번째 '단어'로 건너 뛰고 해당 형식을 기반으로 오른쪽/왼쪽 꼬투리를 감지합니다.

내가 작성한 일부 예비 코드는 작동하지 않습니다. 내가 읽고있는 파일은 Format Y이어야하지만 내 수표가 작동하지 않는다는 것을 안다.

int chunksRead = 0; 
int readByte; 
while ((readByte = stream.ReadByte()) >= 0) 
{ 
    chunksRead++; 

    if (chunksRead == 1) 
    { 
     // Get format 
     bool isFormatY = (readByte & 0x00FF) == 0x0087; 
    } 
    else if (chunksRead == 13) 
    { 
     // Check pods 
    } 
    else if (chunksRead > 13) 
    { 
     break; 
    } 
} 

누구든지 내 구현이 잘못된 것을 볼 수 있습니까? 2 바이트 워드 크기는 어떻게 계산해야합니까?

@Daniel Hilgarth의 응답을 기반으로 편집
빠른 답장을 보내 주셔서 감사합니다. Daniel. 나는 변화를 만들어 지금, 첫 번째 단어에 대한 일하고 :

byte[] rawBytes = new byte[stream.Length]; 
stream.Read(rawBytes, 0, rawBytes.Length); 
ushort formatWord = Convert.ToUInt16(rawBytes[0] << 8 | rawBytes[1]); 
bool formatCheck = (formatWord & 0x00FF) == 0x0087; 

난 그냥이 작업을 완료하기 위해 설치 왼쪽/오른쪽 포드에 대한 긍정적 인 결과를 반환해야 예제 파일을 찾을 필요가있다.

답변

2

바이트와 단어를 혼합합니다. 단어의 위치 13은 왼쪽 또는 오른쪽 창을 설치했는지 여부입니다. 해당 위치로 이동하려면 12 바이트을 읽고 1330 바이트을 확인하십시오. 그것은 절반 밖에되지 않습니다.
동일한 문제가 형식 확인에 있습니다. 첫 번째 단어 (= 2 바이트)을 읽고 원하는 값인지 확인해야합니다.

가 읽고 두 바이트에서 단어를 얻으려면, 당신은 비트 시프트 연산자 < <을 사용할 수

ushort yourWord = firstByte << 8 | secondByte; 
+0

그래서,이 이해를 바탕으로, 13 단어가 25의 조합이됩니다 내 스트림의 26 번째 인덱스 바이트가 맞습니까? 내 원래 게시물에 대한 내 업데이트를 참조하십시오. 나는 당신의 도움을 기반으로 형식을 감지 할 수있었습니다. 고맙습니다. – Hillarie

+0

@Hillarie : 천만에요. 올바른 색인은 24와 25입니다. –