Pertanyaan Bagaimana saya bisa membaca / menulis bit dari / ke file di Java?


Saya perlu membaca file stream sebagai bit dan kemudian saya harus bisa menulis bit untuk file lagi. Apakah ada kelas untuk tujuan ini?


6
2017-12-03 15:37


asal


Jawaban:


Sejauh yang saya tahu, tidak ada cara yang dibangun untuk melakukannya langsung di tingkat bit. Ada cara untuk membaca / menulis byte dengan byte menggunakan built in streams. Anda bisa menulis pembungkus pada aliran yang terlihat seperti membaca dan menulis bit.

Jika Anda menginginkan sesuatu yang sudah ditulis, carilah proyek sumber terbuka yang melakukan pengkodean audio atau video tertentu, karena ada hal-hal seperti itu. Sebagai contoh, codec FLAC memiliki BitInputStream yang mungkin memenuhi kebutuhan Anda.


6
2017-12-03 15:40



Saya cukup senang dengan itu kuda jantan muda perpustakaan dari CERN. Tidak dapat diingat jika mendukung File I / O tetapi saya menggunakannya untuk membaca bitstream, menganalisa dan memodifikasinya dan menulisnya kembali ke file.


5
2017-12-03 15:41



Pindah ke https://github.com/jinahya/bit-io

Silakan dilihat 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>

Ini adalah pustaka praktis kecil untuk membaca / menulis panjang bit acak dengan 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

2
2018-05-28 05:53



Preon mungkin apa yang Anda cari. Melihat pertanyaan Anda, saya dapat membayangkan bahwa Preon mungkin sama lebih dari apa yang Anda cari.

Pikirkan Preon sebagai pustaka yang menyediakan untuk konten yang dienkode bitstream, apa yang dimaksud Hibernate menjadi basis data relasional, dan JAXB ke XML. Sekarang, ada beberapa modul. Salah satu dari modul-modul tersebut adalah preon-binding. Itulah kerangka pengikatan data yang sebenarnya. (Didorong oleh anotasi.)

Namun, preon-binding dibangun di atas preon-bitbuffer (dalam penjelmaan-penjelmaan kemudian di-dubbing kembali ke preon-io). Perpustakaan itu memiliki tipe abstraksi BitBuffer untuk mengakses data terkompresi bitstream.

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

Pembukaan Preon musim panas lalu tidak memiliki dukungan untuk penyandian. Itu sedang berlangsung.


0
2018-01-03 19:45



Dan hanya untuk memberi Anda gambaran tentang cara membuat wrapper aliran Anda sendiri, inilah cuplikan kode.

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;
    }

}

Seperti yang Anda lihat, metode baca () ditimpa untuk mengembalikan 0 atau 1 jika bit tersedia, atau -1 jika akhir aliran yang mendasarinya tercapai.

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());
    }

}

0
2017-12-28 21:21