2009-04-05 8 views
7

Estoy tratando de implementar el algoritmo Huffman para compresión, que requiere escribir bits de longitud variable en un archivo. ¿Hay alguna forma en C++ de escribir datos de longitud variable con granularidad de 1 bit en un archivo?codificación huffman

Respuesta

9

No, la cantidad más pequeña de datos que puede escribir en un archivo es de un byte.

Puede usar un bitset para facilitar la manipulación de los bits, luego use un ofstream para escribir en el archivo. Si no quiere usar el conjunto de bits, puede usar el bitwise operators para manipular sus datos antes de guardarlos.

3

La cantidad más pequeña de bits que puede acceder y guardar es 8 = 1 byte. Puede acceder a los bits en byte utilizando operadores de bits^& |.

Puede establecer el bit enésimo a 1 usando:

my_byte = my_byte | (1 << n); 

donde n es de 0 a 7.

Puede establecer el bit enésimo a 0 usando:

my_byte = my_byte & ((~1) << n); 

Puede alternar enésimo bit usando:

my_byte = my_byte^(1 << n); 

Más detalles here.

2

la respuesta de klew es probablemente la que usted quiere, pero solo para agregar algo a lo que dijo Bill, las bibliotecas de Boost tienen un dynamic_bitset que encontré útil en una situación similar.

1

No. Deberá empacar los bytes. En consecuencia, necesitará un encabezado en su archivo que especifique cuántos elementos hay en su archivo, porque es probable que tenga bits finales que no se utilizan.

+0

No es necesario tener que contar el número de elementos del archivo. Una eof de carácter especial puede ajustarse a la factura –

2

Toda la información que necesita el cambio de bit está aquí:
How do you set, clear, and toggle a single bit?

Pero el objeto más pequeño que se puede poner en un archivo es un byte.
Usaría dynamic_bitset y cada vez que el tamaño fuera mayor que 8, extraiga los 8 bits inferiores en una char y escriba esto en un archivo, luego cambie los bits restantes 8 lugares (repetir).