如何在java中解压缩二进制文件?

时间:2014-11-19 20:47:58

标签: java binary unpack

有人可以帮我了解如何在java中使用下面的代码在ruby中执行的操作。

下面的ruby代码使用 unpack('H *')[0] 以ASCII格式将完整的二进制文件内容存储在变量“var”中。

IO.foreach(ARGV[0]){ |l| 

        var = l.unpack('H*')[0]

} if File.exists?(ARGV[0])

更新 你好阿鲁。我在下面的表格中测试了你说的方式

byte[] bytes = Files.readAllBytes(testFile.toPath());
str = new String(bytes,StandardCharsets.UTF_8);
System.out.println(str); 

但是当我打印变量“str”的内容时,打印输出只显示小方块,就像没有解码内容一样。我想以ASCII格式存储“str”二进制文件的内容。

更新#2: 您好Aru,我正在尝试将所有二进制文件的内容存储在字节数组中,但我不知道该怎么做。有效 “FileUtils.readFileToByteArray(myFile);”但这是一个外部库,是否有内置选项可以做到?

File myFile = new File("./Binaryfile");
byte[] binary = FileUtils.readFileToByteArray(myFile); //I have issues here to store in array of bytes all binary content
String hexString = DatatypeConverter.printHexBinary(binary);
System.out.println(hexString); 

更新#3:

你好ursa和Aru,谢谢你的帮助。我已经尝试了两种解决方案并且工作得很好,但是看到了Files.readAllBytes()文档 它说这不是为了处理大文件而我要分析的二进制文件超过2GB :(。我看到你的解决方案的一个选项,阅读 chunk by chunk。二进制文件中的块由FF65序列分隔,所以有没有办法调整你的代码只处理一个块 时间基于块分隔符?如果没有,可能还有一些外部库。

更新#4: 您好,我正在尝试修改您的代码,因为我想读取基于的可变大小的块 “Var”的值。

如何设置偏移量以读取代码中的下一个块?

我是说, - 在第一次迭代中读取第一个1024, - 在此步骤中Var = 500 - 在2d迭代中读取接下来的1024个字节,从1024开始--Var = 1024-500 = 524 - 在此步骤Var = 712 - 在第3次迭代中,从1548开始读取下一个1024字节 - Var = 1548-712 = 836 - 等等

是否有像read(字节数,偏移量)的方法?

2 个答案:

答案 0 :(得分:0)

你可以使用commons-codec Hex class + commons-io FileUtils class

byte[] binary = FileUtils.readFileToByteArray(new File("/Users/user/file.bin");
String hexEncoded = Hex.encodeHex(binary);

但如果您只想阅读TEXT文件的内容,可以使用:

String content = FileUtils.readFileToString(new File("/Users/user/file.txt", "ISO-8859-1");

使用JRE 7,您可以使用标准类:

public static void main(String[] args) throws Exception {
    Path path = Paths.get("path/to/file");
    byte[] data = Files.readAllBytes(path);

    char[] hexArray = "0123456789ABCDEF".toCharArray();
    char[] hexChars = new char[data.length * 2];
    for ( int j = 0; j < data.length; j++ ) {
        int v = data[j] & 0xFF;
        hexChars[j * 2] = hexArray[v >>> 4];
        hexChars[j * 2 + 1] = hexArray[v & 0x0F];
    }
    System.out.println(new String(hexChars));
}

答案 1 :(得分:0)

这应该做你想要的:

try {
    File inputFile = new File("someFile");
    byte inputBytes[] = Files.readAllBytes(inputFile.toPath());
    String hexCode = DatatypeConverter.printHexBinary(inputBytes);
    System.out.println(hexCode);
} catch (IOException e) {
    System.err.println("Couldn't read file: " + e);
}

如果您不想一次阅读整个文件,也可以这样做。你需要某种InputStream

File inputFile = new File("C:\\Windows\\explorer.exe");
try (InputStream input = new FileInputStream(inputFile)) {
    byte inputBytes[] = new byte[1024];
    int readBytes;
    // Read until all bytes were read
    while ((readBytes = input.read(inputBytes)) != -1) {
        System.out.printf("%4d bytes were read.\n", readBytes);
        System.out.println(DatatypeConverter.printHexBinary(inputBytes));
    }
} catch (FileNotFoundException ex) {
    System.err.println("Couldn't read file: " + ex);
} catch (IOException ex) {
    System.err.println("Error while reading file: " + ex);
}