`
zhang_xzhi_xjtu
  • 浏览: 538678 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

按照bit读取或写入java的IO流

    博客分类:
  • java
 
阅读更多
写了个按照bit读取或写入java的IO流的简单代码,保留在博客里备忘。

/**
 * 按bit读取的input。
 * */
public class BitInput {

    private InputStream input;
    private int         value;
    private int         next = 7;

    public BitInput(InputStream input) {
        this.input = input;
    }

    /**
     * 读取一个bit,1,0,-1(文件结束)。
     * */
    public int readBit() throws Exception {

        if (next == 7) {
            value = input.read();
            if (value == -1) {
                return -1;
            }
        }

        int result = (value & (1 << next)) >>> next;
        next--;

        if (next == -1) {
            next = 7;
        }

        return result;
    }

    /**
     * 读取size个bit。
     * */
    public int[] readBits(int size) throws Exception {
        int[] result = new int[size];
        for (int i = 0; i < size; i++) {
            int v = readBit();
            if (v == -1) {
                throw new RuntimeException();
            }
            result[i] = v;
        }
        return result;
    }
}


/**
 * 按bit写出的output。
 * */
public class BitOutput {

    private OutputStream out;
    private int          value;
    private int          next = 7;

    public BitOutput(OutputStream out) {
        this.out = out;
    }

    public void writeBitOne() throws Exception {
        write(1);
    }

    public void writeBitZero() throws Exception {
        write(0);
    }

    private void write(int bit) throws Exception {
        value = value | (bit << next);
        next--;

        if (next < 0) {
            out.write(value);
            value = 0;
            next = 7;
        }
    }

    public void writeBits(String bits) throws Exception {
        for (int i = 0; i < bits.length(); i++) {
            char v = bits.charAt(i);
            if (v == '0' || v == '1') {
                write(v - '0');
                continue;
            }
            throw new RuntimeException();
        }
    }

    public void writeBits(int[] bits) throws Exception {
        for (int bit : bits) {
            if (bit == 0 || bit == 1) {
                write(bit);
                continue;
            }
            throw new RuntimeException();
        }
    }

    public void close() throws Exception {
        if (next == 7) {
            return;
        }
        out.write(value);
    }
}
1
2
分享到:
评论

相关推荐

    C#二进制的读取与写入

    在实际应用中,我们可能需要读取或写入自定义的数据结构。例如,假设有一个学生类,包含姓名、年龄和成绩。可以使用BinaryFormatter进行序列化和反序列化: ```csharp [Serializable] class Student { public ...

    java8看不到源码-bit-io:用于读取/写入任意长度位的库

    用于读取/写入非八位字节对齐值的库,例如1-bit boolean或17-bit unsigned int 。 请参阅 Java8+ 风味版本。 规格 布尔值 类型 尺寸(最小) 尺寸(最大) 笔记 boolean 1 1 readBoolean() , writeBoolean(boolean) ...

    java IO 字节流详解及实例代码

    在 Java 中,输入输出流是指从外部设备或文件中读取数据或将数据写入外部设备或文件的过程。输入流是指从外部设备或文件中读取数据的流,而输出流是指将数据写入外部设备或文件的流。理解输入输出流的概念是学习 ...

    C#编成Modbus TCP连接PLC寄存器读取、写入.rar

    在本文中,我们将深入探讨如何使用C#编程语言实现Modbus TCP协议,以便与PLC(可编程逻辑控制器)进行通信,实现寄存器的读取和写入操作。Modbus是一种广泛使用的通信协议,特别是在工业自动化领域,它允许设备之间...

    Java中输入输出.pdf

    在 Java 语言中,输入与输出都是通过流(bit stream)来完成的。 一、输入输出流 输入输出流是 Java 中最基本的输入输出方式。输入流是从外部设备读取数据的流,而输出流是将数据写入外部设备的流。输入输出流的最...

    IO口输入输出配置

    使用HAL库,开发者可以更直观地进行GPIO口的配置,例如`HAL_GPIO_Init()`函数用于初始化GPIO口,`HAL_GPIO_WritePin()`和`HAL_GPIO_ReadPin()`分别用于写入和读取IO口状态。 综上所述,理解并熟练掌握STM32 F103的...

    第6章(输入输出流).ppt

    - 流是一个从数据源到目的地的数据序列,Java的所有I/O操作都基于`java.io`包中的流类。 6.1.2 预定义的I/O流类 Java的I/O流根据方向、分工和内容可以分为: - 方向:输入流和输出流。 - 分工:节点流(直接连接到...

    MSP430 IO口的库文件

    2. **数据读写**:对于IO端口的读写操作,库中会有类似`void io_write_port(unsigned char port, unsigned char value)`和`unsigned char io_read_port(unsigned char port)`的函数,分别用于写入和读取端口值。...

    图像数字水印的JAVA实现

    它们提供了读取、写入、显示和修改图像的能力。例如,`BufferedImage`类可以用来创建和操作图像对象,而`ImageIO`类则负责读写图像文件,如JPEG、PNG等格式。 2. **数据编码与解码**:在将水印信息嵌入图像之前,...

    IFIX 组态IO驱动 modbus 以太网协议

    这些驱动程序确保了IFIX能够正确地读取和写入PLC或其他支持Modbus的设备的寄存器。 在提供的压缩包文件中,有以下重要文件: 1. **SERVER.CAB**:可能包含IFIX的Modbus服务器组件,使得IFIX能够作为Modbus主站,向...

    lsb视频水印源代码-JAVA

    - 文件I/O:处理视频文件时,需要读取和写入文件,Java提供了`java.io`包来支持文件操作。 - 字节流:由于视频文件是二进制数据,所以会用到字节输入流和输出流,例如`java.io.FileInputStream`和`java.io....

    java串口通讯简单实例

    5. **串口通信**:一旦串口设置完成,就可以通过`SerialPort`对象的`getOutputStream()`获取输出流,然后使用`PrintWriter`或`DataOutputStream`将TXT文件中的每一行数据写入到串口。 6. **事件监听**:为了实现...

    ATmega16 IO寄存器空间分配表.rar

    同时,通过PORTx寄存器可以写入1或0,控制输出引脚的状态。通过读取PINx寄存器可以获取输入引脚的实时状态。 总结来说,ATmega16的IO寄存器空间分配表是理解和编程ATmega16的基础,它揭示了如何控制和利用微控制器...

    C# 二进制数据写入文本

    在C#编程中,处理二进制数据并将其写入文本文件是一项常见的任务,尤其是在音频处理、数据存储或网络通信等领域。"PCMtoWAV"这个文件名暗示我们可能涉及的是将PCM(脉冲编码调制)音频数据转换为WAV格式的文件。下面...

    32 位的端口 I/O DLL(3KB)...

    1. 将Win95io.dll复制到项目目录或系统路径下,确保程序运行时可以找到。 2. 在VB代码中使用` Declare`语句声明DLL中的函数,指定函数名、参数类型和返回值类型。 3. 加载DLL,使用`LoadLibrary`函数确保DLL被正确...

    电子-IO配置.rar

    这些函数可能包括设置端口方向(输入或输出)、读取或写入数据到端口、配置中断等。例如,可能有一个函数`void set_output(int port_num, int value)`用于将指定端口设置为输出模式并赋值,另一个函数`int read_...

    GD450I-EVAL开发板 emmc测试程序 1bit 4bit

    基于GD32F450I-EVAL开发板的SD卡测试程序,修改移植的emmc测试软件,主要是为了验证可行性和读写速率差别,完整代码,下载即可直接编译运行,若需修改为其他平台,仅修改时钟、IO等配置即可。 完成: 1、emmc卡的...

    java开源工具包RXTX api

    6. **流处理**: RXTX允许通过`InputStream`和`OutputStream`对串口进行读写操作,这样可以与Java的IO或NIO框架无缝集成。 7. **线程安全**: RXTX API设计为线程安全的,因此可以在多线程环境中使用,但要注意正确...

    page_io.rar_swap

    1. **页面读取与写入**:当程序读取或写入内存时,内核会检查对应的页面是否已存在于物理内存中。如果不在,就需要从磁盘读取(page fault);如果写入,会检查页面是否干净,如果脏,则需要先写回。 2. **页面缓存...

Global site tag (gtag.js) - Google Analytics