2017-01-15 1 views
1

한 번에 10 비트 씩 바이너리 데이터에 액세스하려고합니다. 가장 좋은 방법은 부호없는 long long으로 40 비트를 읽은 다음 비트 마스킹을 사용하여 원하는 데이터에 액세스하는 것입니다. 내 노력은 64 비트를 읽는 것 같고 누군가 내가 잘못 가고있는 부분을 지적 할 수 있는지 궁금합니다. 감사.이진 데이터를 한 번에 40 비트 읽음

FILE * pFile; 
long lSize; 
unsigned long long * buffer; 
size_t result; 

pFile = fopen ("test.bin" , "rb"); 
if (pFile==NULL) {fputs ("File error",stderr); exit (1);} 

fseek (pFile , 0 , SEEK_END); 
lSize = (ftell (pFile))/5; 
rewind (pFile); 

buffer = (unsigned long long*) malloc (sizeof(unsigned long long)*lSize); 
if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);} 

result = fread (buffer,5,lSize,pFile); 
if (result != lSize) {fputs ("Reading error",stderr); exit (3);} 

때 I 출력 버퍼 [0] 내가 갖는 :

0100110111001110101110001110000111011111110001100011100110111011 

하지만 난 뭔가 얻을 것이라고 생각 :

0000000000000000000000001110000111011111110001100011100110111011 
+1

그리고 파일 test.bin의 실제 내용이 무엇인가 :

일반적인 방법은 읽지 않은 비트의 수와 함께 1 바이트 버퍼를 유지하는 것입니다? HxD와 같은 16 진수 편집기에서 엽니 다 (Windows에서 작업한다고 가정). – Dialecticus

+2

버퍼를 0으로 초기화합니다. 예를 들어'calloc'을 사용하십시오. – pSoLT

+0

@Dialecticus 방금 16 진수 편집기를 다운로드하고 내용을 확인하지 않았습니다. There 1011101100111001110001101101111100111001110001101101111111100001 – Kahless

답변

2

현재 대부분의 운영 체제가 허용하지 않는 비트 파일에 대한 액세스. 파일은 시스템 호출 (read() ...) 또는 표준 라이브러리 함수 (getc(), fread() ...)를 통해 바이트 단위로 읽습니다.

내용을 비트로 조작하려면이 비트가 파일 바이트에 저장 (패킹)되는 방법을 알아야합니다.

때로는 비트가 낮은 순서의 비트로 먼저 채워지는 경우가 있습니다. 때로는 높은 순서의 비트로 먼저 채워지는 경우가 있습니다.이 기본 방식은 단어 단위로 이루어지기 때문에 단어가 최소한 중요한 바이트 먼저 저장 될 수 있으므로 복잡함이 추가됩니다 (일명 리틀 엔디안 형식) 또는 가장 중요한 바이트 먼저 (일명 빅 엔디안 형식).

typedef struct bitreader { 
    FILE *stream; 
    int bits; 
    unsigned char buffer; 
} bitreader; 

bitreader *bitopen(const char *filename) { 
    bitreader *bp = calloc(sizeof(*bp)); 
    if (bp) { 
     bp->stream = fopen(filename, "rb"); // open in binary mode 
     if (bp->stream == NULL) { 
      free(bp); 
      bp = NULL; 
     } 
    } 
    return bp; 
} 

void bitclose(bitreader *bp) { 
    fclose(bp->stream); 
    free(bp); 
} 

/* simplistic method to read bits packed with most significant bit first */ 
long long int bitread(bitreader *bp, int count) { 
    long long int val = 0; 
    while (count > 0) { 
     if (bp->bits == 0) { 
      int c = getc(bp->stream); 
      if (c == EOF) 
       return EOF; 
      bp->buffer = c; 
      bp->bits = 8; 
     } 
     val <<= 1; 
     val |= (bp->buffer >> 7) & 1; 
     bp->buffer <<= 1; 
     bp->bits--; 
     count--; 
    } 
    return val; 
} 
+0

답변을 주셔서 감사합니다. 매우 철저합니다. – Kahless

관련 문제