2013-10-07 1 views
-2

8 비트에 맞지 않는 파일의 이진 데이터에 쓰려고합니다. 당신이 미리 정의 된 8, 16, 32, 64의 길이로 그것을 그룹화 할 수 있다면, 나는 당신이 어떤 길이의 이진 데이터라도 쓸 수 있다는 것을 이해합니다. 파일에 9 비트 만 쓰는 방법이 있습니까? 또는 9 비트의 두 값?C에서 9 비트 이진 데이터 쓰기

하나의 값은 + 32768 범위에 있고 3 값은 +256 범위입니다. 대부분의 공간을 절약하는 방법은 무엇입니까? 일반적으로 8 비트 될 것입니다 데이터의 1 char를 저장하는 표현들 :

+6

코드를 게시하십시오 ... – Gangadhar

+1

가능한 복제본 [C로 파일에 비트 쓰기] (http://stackoverflow.com/questions/13252697/writing-bits-to-a-file-in-c) –

+0

작업 할 가능성이있는 모든 시스템에서 파일은 항상 길이가 바이트 수, 즉 8 비트의 배수입니다. 물론 3 바이트 (24 비트)를 사용하여 두 개의 9 비트 값 (18 비트)을 쓸 수 있습니다. – davmac

답변

1

아니, 난 C의 파일 I/O API를 사용하는 방법이 생각하지 않습니다 감사합니다.

9 비트 시스템 인 경우 CHAR_BIT이 실제로 9 인 경우 사소할 것입니다.

"실제로 필요한 경우 정확한 비트 수를 사용하여 제한된 범위의 숫자를 저장할 수있는 방법"이 무엇인지 궁금한 점이 있다면 큰 파일 내에서 가능합니다.

이것은 종종 bitstreaming이라고하며 일부 정보에 사용되는 공간을 최적화하는 좋은 방법입니다. 비트 스트림 형식을 인코딩/디코딩하려면 실제 파일에서 현재 입/출력 바이트를 "소비"한 비트 수를 추적해야합니다. 조금 복잡하지만 그리 어렵지는 않습니다.

기본적으로, 당신이 필요합니다 :

  • 바이트 스트림 s, 즉 뭔가 당신이 이러한 FILE * 등으로 바이트를 넣을 수 있습니다.
  • 비트 인덱스 i 즉, 방출 한 비트 수를 추적하는 부호없는 값입니다.
  • 비트가 들어갈 수있는 현재 바이트 x이 매 번 증가 할 때마다 i이 증가합니다. iCHAR_BIT에 도달하면 s에 쓰고 i을 0으로 재설정하십시오.
-1

당신은 64 기수의 원리를 적용 할 수 있습니다 (그냥 작게하지, 기지를 확대).

모든 값은 2 바이트로 기록되며 shift 또는 or 연산에 의해 마지막/다음 바이트와 결합됩니다.

매우 추상적 인 설명이 도움이되기를 바랍니다.

0

-256에서 +256까지의 값을 9 비트로 저장할 수 없습니다. 그것은 513 개의 값이고 9 개의 비트는 512 개의 값만 구별 할 수 있습니다. 이와 같은

struct MyStruct 
{ 
    int a : 16; 
    int b : 9; 
    int c : 9; 
    int d : 9; 
}; 

객체가 여전히있을 것입니다 : 실제 범위는 -32768 32767과 -256 255에가, 당신은 하나의 구조로 팩을 비트 필드를 사용할 수있는 경우

전체 바이트 수가 반올림되므로 위의 예는 일반적인 시스템에서 6 바이트를 갖습니다. 총 43 비트를 사용하고 8 비트 바이트의 다음 정수는 48 비트를 갖기 때문입니다.

이 패딩을 43 비트에서 48 비트로 허용하거나 더 복잡한 코드를 사용하여 파일에 쓰기 전에 비트를 더 연결할 수 있습니다.이 경우 비트를 바이트 시퀀스로 어셈블하는 추가 코드가 필요합니다. 저장 공간이 현재 저렴하기 때문에 거의 쓸모가 없습니다.