2017-12-21 40 views
0

나는 압축하는 프로그램을 만들려고합니다. 예를 들어 정규 8 비트 (char) 대신 1 또는 2 비트 만 쓰는 것은 우리가 쓰려고하는 char에 달려 있습니다. 나는 다음과 같이 써 보려고했다 :bin 파일에 단일 비트를 쓰는 방법

//I dont know what the function should return 
char getBytes(char c) 
{ 
    return 0xff; 
} 

ofstream fout; 
fout.open("file.bin", ios::binary | ios::out); 
fout << getBytes(c); 

그러나 지금까지는 글자 만 쓰고있다. 그래서 어떻게 쓸 수 있습니까 : '01'? 또는 '1'만? 바이트로만 파일에 쓰기 위해 사용해야하는 함수는 무엇입니까? 감사.

+3

특정 비트를 작성해야 할 경우 바이트로 버퍼링하고 8 비트로 채워진 바이트를 기록해야합니다. – Joe

+2

비트를 쓰고 싶은 * 바이트 * 오프셋으로 이동하여 기존 바이트를 수정하고 원하는대로 비트를 수정 한 다음 같은 위치에 다시 바이트를 씁니다. –

답변

1

스트림은 일련의 바이트입니다. 개별 비트를 쓰는 표준 인터페이스는 없습니다. 개별 비트를 작성하려면 스트림 상단에 비트 스트림 의 자체 추상화를 생성해야합니다. 여러 비트를 하나의 바이트로 집계 한 다음 기본 스트림에 기록합니다. 합리적인 효율적인 작성을 원한다면 스트림에 쓰기 전에 여러 바이트를 집계해야 할 것입니다.

순진 구현은 다음과 같을 수 있습니다 :이 구현은 마지막 바이트 오히려 기본적인 처리를 가지고

class bitstream { 
    std::streambuf* sbuf; 
    int    count = 0; 
    unsigned char byte = 0; 
public: 
    bitstream(std::ostream& out): sbuf(out.rdbuf()) {} 
    ~bitstream() { 
     if (this->count) { 
      this->sbuf->sputc(this->byte); 
     } 
    } 
    bitstream& operator<< (bool b) { 
     this->byte = (this->byte << 1) | b; 
     if (++this->count == 8) { 
      this->sbuf->sputc(this->byte); 
      this->count = 0; 
     } 
     return *this; 
    } 
}; 

참고 : 바이트가 시작된 경우는 그대로 기록됩니다. 이것이 의도 한 동작인지 여부 또는 마지막 바이트의 최상위 비트에있는 기록 된 비트에 대해 이동해야하는지 여부는 사물이 사용되는 방법에 따라 다릅니다. 또한 기본 스트림을 쓸 수없는 경우 오류 처리가 없습니다. (그리고 코드는 테스트하지 않은 것입니다 - 내 휴대 전화에 컴파일 할 수있는 쉬운 방법이 없습니다)

당신은이 같은 클래스 뭔가를 사용하십시오 : 내가 일을 엉망 않는

int main() { 
    std::ofstream file(“bits.txt”, std::ios_base::binary); 
    bitstream  out(file); 

    out << false << true << false << false 
     << false << false << false << true; 
} 

을의이 위 코드는 A을 파일 bits.txt (A의 ASCII 코드는 65)로 작성해야합니다.

컨텍스트에만 해당 : 파일은 실제로 바이트 블록으로 구성됩니다. 그러나 스트림 추상화는 블록으로 작성된 개별 바이트를 집계합니다. 바이트 단위의 인터페이스는 널리 사용되는 모든 운영 체제에서 제공하지만 데이터 블록을 작성하는 것은 다소 비효율적 인 경향이 있습니다.

+0

고마워, 그래서 비트 스트림 클래스의 새로운 쇼를 만들 필요가있다. 나는 그에게 모든 바이트를 삽입해야하고, 버퍼가 'full'(8 비트) 일 때 나는 파일에 비트 스트림을 쓸 것인가? 어떻게 내가 그녀를 삽입합니까? 죄송합니다. 저는 cpp에서 새롭고 'sbuf (out.rdbuf())'와 같은 명령을 완전히 이해하지 못합니다. 너 진짜 도움이된다! –

+0

은 8 비트를 char로 변환하는 방법입니까? 더 간단해질 것입니다. –

+0

@Markgreen : 저는 혼란 스럽습니다 - 당신의 목표가'char's가 아닌 비트를 쓰는 것이라고 생각 했습니까? 비트 스트림의 목적은 바로 그것을 제공하는 것입니다. –