是否可以通过确定要读取的数量来循环读取位?

什克利亚尔

有一个 DataInputStream 可以从中读取

我遇到了一个特定的算法:

  1. int[] nmbrs = new int[64];

  2. 读取一个 4 位无符号整数。分配长度读取的值

  3. for (int i = 0; i < 64; i++)

    3.1 读取一个长度位无符号整数为 nmbrs[i]

可以用Java编写吗?怎么写?

安德烈亚斯

创建一个BitInputStream从底层读取位DataInputStream

像这样:

public final class BitInputStream implements Closeable {

    private final InputStream in;
    private final ByteOrder streamBitOrder;
    private int bits;
    private byte bitsLeft;

    public BitInputStream(InputStream in) {
        this(in, ByteOrder.BIG_ENDIAN);
    }

    public BitInputStream(InputStream in, ByteOrder bitOrder) {
        Objects.requireNonNull(in);
        Objects.requireNonNull(bitOrder);
        this.in = in;
        this.streamBitOrder = bitOrder;
    }

    @Override
    public void close() throws IOException {
        this.in.close();
    }

    public int readBit() throws IOException {
        if (this.bitsLeft == 0) {
            if ((this.bits = this.in.read()) == -1)
                throw new EOFException();
            this.bitsLeft = 8;
        }
        int bitIdx = (this.streamBitOrder == ByteOrder.BIG_ENDIAN ? this.bitsLeft - 1 : 8 - this.bitsLeft);
        this.bitsLeft--;
        return (this.bits >> bitIdx) & 1;
    }

    public int readInt() throws IOException {
        return readInt(Integer.SIZE, this.streamBitOrder);
    }

    public int readInt(ByteOrder bitOrder) throws IOException {
        return readInt(Integer.SIZE, bitOrder);
    }

    public int readInt(int len) throws IOException {
        return readInt(len, this.streamBitOrder);
    }

    public int readInt(int len, ByteOrder bitOrder) throws IOException {
        if (len == 0)
            return 0;
        if (len < 0 || len > Integer.SIZE)
            throw new IllegalArgumentException("Invalid len: " + len + " (must be 0-" + Integer.SIZE + ")");
        int value = 0;
        if (bitOrder == ByteOrder.BIG_ENDIAN) {
            for (int i = 0; i < len; i++)
                value = (value << 1) | readBit();
        } else {
            for (int i = 0; i < len; i++)
                value |= readBit() << i;
        }
        return value;
    }

}

测试

public static void main(String[] args) throws Exception {
    String bitData = "0101 00001 00001 00010 00011 00101 01000 01101 10101" // 5: 1, 1, 2, 3, 5, 8, 13, 21
                  + " 0011 000 001 010 011 100 101 110 111";                // 3: 0, 1, 2, 3, 4, 5, 6, 7
    BigInteger bi = new BigInteger(bitData.replaceAll(" ", ""), 2);
    System.out.println("0x" + bi.toString(16) + " = 0b" + bi.toString(2));
    byte[] byteData = bi.toByteArray();
    try (BitInputStream in = new BitInputStream(new ByteArrayInputStream(byteData))) {
        int[] nmbrs = readNmbrs(in);
        int[] nmbrs2 = readNmbrs(in);
        System.out.println(Arrays.toString(nmbrs));
        System.out.println(Arrays.toString(nmbrs2));
    }
}
private static int[] readNmbrs(BitInputStream in) throws IOException {
    int[] nmbrs = new int[8];
    int length = in.readInt(4);
    for (int i = 0; i < nmbrs.length; i++)
        nmbrs[i] = in.readInt(length);
    return nmbrs;
}

输出

0x5084432a1b53053977 = 0b10100001000010001000011001010100001101101010011000001010011100101110111
[1, 1, 2, 3, 5, 8, 13, 21]
[0, 1, 2, 3, 4, 5, 6, 7]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

是否可以通过procfs确定进程打开了哪些fds进行读取和写入操作?

来自分类Dev

是否可以通过在Tkinter中读取保存的文件来创建按钮

来自分类Dev

是否可以通过这样的Powershell读取Excel?

来自分类Dev

是否可以通过从命名管道或标准输入中读取数据来制作多卷RAR存档?

来自分类Dev

是否可以通过读取和/或引号引起外壳注入?

来自分类Dev

通过不使用许多循环来读取大型数据集来更改代码

来自分类Dev

是否可以从 BigTable 异步读取?

来自分类Dev

是否可以连接到特定队列并读取指定数量的消息?

来自分类Dev

是否可以在所有平台上确定性地从jpeg文件中读取像素?

来自分类Dev

是否可以通过更改目录中文件数量来触发脚本?

来自分类Dev

fstab可以通过读取文件或文件名来动态挂载分区吗?

来自分类Dev

是否可以在R中读取geoJSON或topoJSON文件来绘制Choropleth映射?

来自分类Dev

是否可以在R中读取geoJSON或topoJSON文件来绘制Choropleth映射?

来自分类Dev

Java-确定要从wave文件读取以获取时间戳的字节数

来自分类Dev

mbrtowc:如果读取空字符,如何确定要跳过的字符数

来自分类Dev

是否可以在不使用flex循环的情况下读取ArrayCollection?

来自分类Dev

通过限制读取的数据量来从缓冲读取器读取数据

来自分类Dev

验证是否可以通过在两个不同列表的值之间来回循环来构造单词

来自分类Dev

我可以通过HTTP读取的响应大小是否有限制

来自分类Dev

是否可以通过api读取标准的etherpad作为文本文档?

来自分类Dev

如果通过原子操作进行门控,非原子写入是否可以安全读取?

来自分类Dev

是否可以使用Automator / Applescript通过读取文件夹内容来生成JSON文件?

来自分类Dev

是否可以通过api读取标准的etherpad作为文本文档?

来自分类Dev

我需要根据Excel中未来客户的估计数量来确定要雇用多少新销售代表

来自分类Dev

在循环中从字节数组读取任意数量的字节

来自分类Dev

通过在C中标记字符串来获取尝试读取文本文件的无限循环

来自分类Dev

是否可以在编译时读取文件?

来自分类Dev

是否可以快速读取授权文件

来自分类Dev

是否可以在Haskell中“读取”函数?

Related 相关文章

  1. 1

    是否可以通过procfs确定进程打开了哪些fds进行读取和写入操作?

  2. 2

    是否可以通过在Tkinter中读取保存的文件来创建按钮

  3. 3

    是否可以通过这样的Powershell读取Excel?

  4. 4

    是否可以通过从命名管道或标准输入中读取数据来制作多卷RAR存档?

  5. 5

    是否可以通过读取和/或引号引起外壳注入?

  6. 6

    通过不使用许多循环来读取大型数据集来更改代码

  7. 7

    是否可以从 BigTable 异步读取?

  8. 8

    是否可以连接到特定队列并读取指定数量的消息?

  9. 9

    是否可以在所有平台上确定性地从jpeg文件中读取像素?

  10. 10

    是否可以通过更改目录中文件数量来触发脚本?

  11. 11

    fstab可以通过读取文件或文件名来动态挂载分区吗?

  12. 12

    是否可以在R中读取geoJSON或topoJSON文件来绘制Choropleth映射?

  13. 13

    是否可以在R中读取geoJSON或topoJSON文件来绘制Choropleth映射?

  14. 14

    Java-确定要从wave文件读取以获取时间戳的字节数

  15. 15

    mbrtowc:如果读取空字符,如何确定要跳过的字符数

  16. 16

    是否可以在不使用flex循环的情况下读取ArrayCollection?

  17. 17

    通过限制读取的数据量来从缓冲读取器读取数据

  18. 18

    验证是否可以通过在两个不同列表的值之间来回循环来构造单词

  19. 19

    我可以通过HTTP读取的响应大小是否有限制

  20. 20

    是否可以通过api读取标准的etherpad作为文本文档?

  21. 21

    如果通过原子操作进行门控,非原子写入是否可以安全读取?

  22. 22

    是否可以使用Automator / Applescript通过读取文件夹内容来生成JSON文件?

  23. 23

    是否可以通过api读取标准的etherpad作为文本文档?

  24. 24

    我需要根据Excel中未来客户的估计数量来确定要雇用多少新销售代表

  25. 25

    在循环中从字节数组读取任意数量的字节

  26. 26

    通过在C中标记字符串来获取尝试读取文本文件的无限循环

  27. 27

    是否可以在编译时读取文件?

  28. 28

    是否可以快速读取授权文件

  29. 29

    是否可以在Haskell中“读取”函数?

热门标签

归档