java - 如何保持写入文件的二进制数据的一致性?

标签 java binary hex binaryfiles dataoutputstream

我正在尝试将二进制字符串写入文件,然后读取它并以十六进制表示形式呈现。这是我的代码:

import java.io.*;
import java.math.BigInteger;

public class TestByte {
      public static void main(String[] argv) throws IOException {

String bin = "101101010110001000010011000000000100010000000001000000000000000100000000000000000000000000000000000010110000000000111111000101010001100000000000000000000000000000001000000000000000000000111110011111000000000010110011";

    //write binary file
    DataOutputStream out = null;
    File fileout = new File("binout.bin");
    out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(fileout)));
    int indx = 0;
    for (int i = 0; i < bin.length()/8; i++){
        System.out.println(bin.substring(indx, indx+8));
        byte[] bytesout = new BigInteger(bin.substring(indx, indx+8),2).toByteArray();
        out.write(bytesout);
        indx += 8;
    }
    out.close();

    //read binary file
    File filein = new File("binout.bin");       
    byte[] bytesin = new byte[(int) filein.length()];
    FileInputStream inputStream = new FileInputStream(filein);
    inputStream.read(bytesin);
    inputStream.close();

    StringBuilder sb = new StringBuilder();
    for (byte b : bytesin) {
        sb.append(String.format("%02X ", b));
    }
    System.out.println(sb.toString());      
}}

程序可以运行,但是与数据存在一些不一致。 这是输出:

10110101 01100010 00010011 00000000 01000100 00000001 00000000 00000001 00000000 00000000 00000000 00000000 00001011 00000000 00111111 00010101 00011000 00000000 00000000 00000000 00001000 00000000 00000000 00111110 01111100 00000000 10110011

00 B5 62 13 00 44 01 00 01 00 00 00 00 0B 00 3F 15 18 00 00 00 08 00 00 3E 7C 00 00 B3

如您所见,我已将二进制字符串分成 8 位的片段,以便更容易理解数字。不一致之处在于十六进制表示形式。十六进制字符串的开头似乎有一个额外的“00”,这是不应该存在的。另外,字符串末尾多了一个“00”,“B3”之前只能有一个“00”。

任何人都可以阐明这个问题和/或使解决方案更加优雅吗?任何帮助,将不胜感激。谢谢。

最佳答案

您应该像这样使用 Integer.parseInt 以避免符号/2 补码问题。

这对我有用:

for (int i = 0; i < bin.length()/8; i++){
    System.out.println(bin.substring(indx, indx+8));
    int b = Integer.parseInt(bin.substring(indx, indx+8),2);
    out.writeByte(b);
    indx += 8;
}

另请参阅:Converting a String representation of bits to a byte

关于java - 如何保持写入文件的二进制数据的一致性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35888669/

相关文章:

Python 3 - 将 2 位整数转换为 2 个字符的十六进制等效值

java - 尝试查找最小值数组时出现异常

java - 不支持 Spring Boot 405 POST 方法?

java - Android ffmpgeg - 没有任何反应

TFS 和存储二进制文件

assembly - 为什么在ASM中使用十六进制?

python - 通过python 3中的网络套接字接收二进制数据

Java : method that takes in argument any attribute of any class

java - java中的剪贴板监听器

C++ ifstream/fstream 破坏数据