2009-12-03 20 views

Respuesta

6

Hasta donde yo sé, no existe una forma integrada de hacerlo directamente en el nivel de bit. Hay formas de leer/escribir byte por byte utilizando las transmisiones incorporadas. Podría escribir un contenedor en una secuencia que parece que lee y escribe bits.

Si desea algo que ya está escrito, busque proyectos de código abierto que hagan ciertos tipos de codificación de audio o video, ya que hay cosas como esas. Por ejemplo, el códec FLAC tenía un BitInputStream que podría satisfacer sus necesidades.

5

Estaba muy contento con la biblioteca colt del CERN. No puedo recordar si es compatible con File I/O, pero lo usé para leer bitstreams, analizarlos y modificarlos y volver a escribirlos en los archivos.

+1

+1 Estaba a punto de ir a buscar ese enlace cuando vi tu respuesta :) La manipulación de los bits de colt es bastante completa. Sin embargo, es posible que desee implementar un contenedor de flujo desde cero, ya que puede obtener un mejor rendimiento al cambiar repetidamente un largo y devolver el siguiente bit, en lugar de llamar repetidamente a BitVector.get (n) con colt. –

0

Preon podría ser lo que estás buscando. En cuanto a sus preguntas, podría imaginar que Preon podría ser incluso más de lo que está buscando.

Piense en Preon como una biblioteca que proporciona contenido codificado bitstream lo que Hibernate pretende ser para bases de datos relacionales, y JAXB para XML. Ahora, existe de un par de módulos. Uno de esos módulos es preun vinculante. Ese es el marco de enlace de datos real. (Impulsado por anotaciones).

Sin embargo, preon-binding está construido en la parte superior de preon-bitbuffer (en encarnaciones posteriores, se vuelve a doblar a preon-io). Esa biblioteca tiene el tipo de abstracción de BitBuffer para acceder a datos comprimidos de flujo de bits.

alt text http://preon.flotsam.nl/images/layers.png

La liberación Preon verano pasado no tiene soporte para la codificación todavía. Eso es trabajo en progreso.

2

Se traslada a https://github.com/jinahya/bit-io

favor, eche un vistazo a http://jinahya.googlecode.com/svn/trunk/com.googlecode.jinahya/bit-io/src/main/java/com/googlecode/jinahya/io/

<dependency> 
    <!-- resides in central repo --> 
    <groupId>com.googlecode.jinahya</groupId> 
    <artifactId>bit-io</artifactId> 
    <version>1.0-alpha-13</version> 
</dependency> 

Se trata de una pequeña biblioteca práctico para la lectura/escritura de longitud arbitraria de bits con Java.

final InputStream stream; 
final BitInput input = new BitInput(new BitInput.StreamInput(stream)); 

final int b = input.readBoolean(); // reads a 1-bit boolean value 
final int i = input.readUnsignedInt(3); // reads a 3-bit unsigned int 
final long l = input.readLong(47); // reads a 47-bit signed long 

input.align(1); // 8-bit byte align; padding 


final WritableByteChannel channel; 
final BitOutput output = new BitOutput(new BitOutput.ChannelOutput(channel)); 

output.writeBoolean(true); // writes a 1-bit boolean value 
output.writeInt(17, 0x00); // writes a 17-bit signed int 
output.writeUnsignedLong(54, 0x00L); // writes a 54-bit unsigned long 

output.align(4); // 32-bit byte align; discarding 
0

Y para darle una idea de cómo crear su propio contenedor de flujo, aquí está el fragmento de código.

import java.io.FilterInputStream; 
import java.io.IOException; 
import java.io.InputStream; 

public class BitInputStream extends FilterInputStream { 

    private int bitsBuffer = -1; 

    private int remainingBits = 0; 

    public BitInputStream(InputStream in) { 
     super(in); 
    } 

    @Override 
    public int read() throws IOException { 
     if (remainingBits == 0) { 
      bitsBuffer = in.read(); 
      remainingBits = Byte.SIZE; 
     } 
     if (bitsBuffer == -1) { 
      return -1; 
     } 
     remainingBits--; 
     return (bitsBuffer >> remainingBits) & 1; 
    } 

} 

Como se puede ver el método read() se reemplaza para devolver 0 o 1 si un bit está disponible, o -1 si se alcanza el final de la secuencia subyacente.

import org.junit.Test; 
import java.io.ByteArrayInputStream; 
import static org.junit.Assert.assertEquals; 

public class BitInputStreamTest { 

    @Test 
    public void read() throws Exception { 
     // 99 in two's complement binary form is 01100011 
     BitInputStream in = new BitInputStream(
      new ByteArrayInputStream(new byte[]{99})); 

     assertEquals(0, in.read()); 
     assertEquals(1, in.read()); 
     assertEquals(1, in.read()); 
     assertEquals(0, in.read()); 

     assertEquals(0, in.read()); 
     assertEquals(0, in.read()); 
     assertEquals(1, in.read()); 
     assertEquals(1, in.read()); 

     assertEquals(-1, in.read()); 
    } 

} 
Cuestiones relacionadas