如何在二进制文件中写入单字节值-java



我已经尝试了很多方法来编写一个程序:按原样在文件中写入一个字节的值......例如在文件中写入01010101.然后我想读取文件并打印我写的内容。所以它应该显示01010101。我的代码都没有工作。有什么帮助吗?因为我正在编写压缩程序,所以必须是 1 字节而不是 8 字节

import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.File;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main2 {
    public static void main(String[] args) throws Exception {
        DataOutputStream dos = new DataOutputStream(new FileOutputStream("Text.t"));
        dos.writeBytes(String.valueOf(01010101));
        File file = new File("Text.t");
        BufferedReader br = new BufferedReader(
            new InputStreamReader(
                new FileInputStream(file)));
        System.out.println(br.readLine());
        dos.close();
        br.close();
    }
}

它适用于以 1 星星但 0 不星的二进制代码..例如,对于01010101它显示266305

"它适用于二进制代码,例如,对于它显示266305 01010101的二进制代码,它"的问题在于01010101是一个八进制文字,并且被编译器读入为基数 8(又名八进制)。

在编写文字时1010101 - 前导零对数字没有任何意义;但它们确实对 Java 代码的解析方式有意义!

显示为"00xyz"的十进制数通常以零填充,这应用于字符串表示形式;数字本身是 xyz。


从评论中,我相信所需的操作是使用二进制文字。您必须使用"位转换器"发出此值才能按预期显示 - 位转换器将取 eg 的值。 0b11(整数 3)并将其转换为字符串"11"。您可能还希望应用具有假定输出宽度的填充 - 同样,0b01 == 0b1和前导 0 对整数没有任何意义。

以下内容将发出霍夫曼位序列的十进制字符串表示形式,没有任何前导零。但是,当与上述配对时,这应该会让您走上正确的轨道。

 dos.writeBytes(String.valueOf(0b01001010));

我会对基数 2 使用字节表示,例如 Byte.parseByte("00010001", 2) .但问题是 Java 的原语是有符号数字,因此它不适用于负值(当第一个数字为 1 时),因此Byte.parseByte("10010011", 2)会抛出NumberFormatException

这里的诀窍是最初替换前导数字(如果它是 1,则用 0),解析它,然后再次将位设置为 1。然后将此字节存储到您的文件中。

private static byte binaryStringToByte(String s) {
    //also check for null, length = 8, contain 0/1 only etc.
    if (s.startsWith("0")) {
        return Byte.parseByte(s, 2);
    } else {
        StringBuilder sBuilder = new StringBuilder(s);
        sBuilder.setCharAt(0, '0');
        byte temp = Byte.parseByte(sBuilder.toString(), 2);
        return (byte) (temp | (1 << 7));
    }
}

然后,要获取字节的二进制字符串表示形式,请使用以下代码:

byte b = binaryStringToByte("10001000");
String s1 = String.format("%8s", Integer.toBinaryString(b & 0xFF)).replace(' ', '0');

最新更新