`
zhang_xzhi_xjtu
  • 浏览: 524557 次
  • 性别: 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
分享到:
评论

相关推荐

    Java之IO流学习总结

    Java IO流学习总结 Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据...

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

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

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

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

    LogIo:日志IO是用于访问测井文件的库

    日志I / O-用于访问测井文件的库日志I / O是用于读取和写入良好日志文件的库。 从Q1 / 2021开始,Log I / O支持DLIS,LIS,LAS 2.0,LAS 3.0,BIT,XTF,ASC,SPWLA,CSV,XML(WITSML)和JSON Well Log格式。 日志I...

    fujinet-platformio:Atari到ESP32 WiFi多功能固件

    #FujiNet 基于ESP32硬件的... FujiNet当前提供以下设备: D:用于磁盘仿真,允许通过本地网络或Internet在SD卡或TNFS服务器上读取或写入磁盘映像。 P:用于打印仿真,为各种类型的流行打印机提供打印机仿真,包括Atari

    PCF8575_library:使用arduino,esp8266和esp32的i2c数字扩展器的库。 仅用2根线就可以读取写入数字值(对于ESP-01来说是完美的)

    只能用2根线读取和写入数字值(对于ESP-01来说是完美的)。 教程: 去下载。 单击右上角的“下载”按钮,重命名未压缩的文件夹PCF8575。 检查PCF8575文件夹是否包含PCF8575\\.cpp和PCF8575.h 。 将DHT库文件夹放置...

    hdparm命令 显示与设定硬盘参数

    hdparm命令用于检测,显示与设定IDE或SCSI硬盘的参数。 语法格式:hdparm [参数] 常用参数: -a 设定读取文件时,预先存入块区的分区数 ...IO_support = 0 (default 16-bit) readonly = 0 (off) readahe

    STM32调试报告.docx

    在固件库中操作 IDR 寄存器读取 IO 端口数据是通过 GPIO_ReadInputDataBit 函数实现的: uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) 比如我要读 GPIOA.5 的电平状态,那么方法是: ...

    ds1302时钟 液晶显示

    void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数) { unsigned char i; ACC = d; for(i=8; i&gt;0; i--) { DS1302_IO = ACC0; //相当于汇编中的 RRC DS1302_CLK = 1; DS1302_CLK = 0; ...

    oracle详解

    oracle会避开sql语句处理引擎,直接从数据库文件中读取数据,然后写入导出文件. 可以在导出日志中观察到: exp-00067: table xxx will be exported in conventional path 如果没有使用直接路径,必须保证buffer参数的值...

    proteus 中液晶模块

    12864 C程序设计 #include __CONFIG(0x1832); //芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡 #define rs RA5 //命令/数据选择 #define rw RA4 //读/写选择 ... bit busy; ...

Global site tag (gtag.js) - Google Analytics