在Java中将十六进制文件转换为unsigned int 32 Big-Endian



这可能是一个已经被问到的问题,但是我还没有找到一个满意的答案。特别是因为这种转换一直是在c或c++中完成的。

顺便说一句,如何将十六进制文件(200MB)转换为Java中的UINT32大端位数表示?

这是我想要实现的一个例子:

54 00 00 00  -> 84       
55 F1 2E 04  -> 70185301
A2 3F 32 01  -> 20070306  
and so on

编辑

File fileInputString = new File(inputFileField.getText());
FileInputStream fin = new FileInputStream(fileInputString); 
FileOutputStream out = new FileOutputStream(fileDirectoryFolder.getText() +"/"+ fileInputString.getName());
byte[] fileContent = new byte[(int)fileInputString.length()];
fin.read(fileContent);
System.out.println("File Lenght" + fileContent.length);
for(int i = 0; i < fileContent.length; i++){
Byte b = fileContent[i]; // Boxing conversion converts `byte` to `Byte`
int value = b.intValue();
out.write(value);
}
close();                                            
System.out.println("Done"); 

编辑2

File fileInputString = new File(inputFileField.getText());
FileInputStream fin = new FileInputStream(fileInputString); 
FileOutputStream out = new FileOutputStream(fileDirectoryFolder.getText() +"/"+ fileInputString.getName());
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] fileContent = new byte[(int)fileInputString.length()];
System.out.println("File Lenght" + fileContent.length);
int bytesRead;
while (( bytesRead = fin.read(fileContent)) != -1) {
ByteBuffer.wrap(fileContent).order(ByteOrder.LITTLE_ENDIAN).getLong();
bos.write(fileContent, 0, bytesRead);
}
out.write(bos.toByteArray()); 
System.out.println("Done"); 

编辑3

DataOutputStream out = new DataOutputStream(new FileOutputStream(output)); 
DataInputStream in = new DataInputStream(new FileInputStream(input))) {
int count = 0;        
while (count < input.length() - 4) {
    in.readFully(buffer, 4, 4);
    String s=Long.toString(ByteBuffer.wrap(buffer).order(ByteOrder.LITTLE_ENDIAN).getLong());
    out.writeBytes( s + " ");
    count += 4;
}

谢谢

下面的代码应该足够了。它使用long值来确保我们可以完全表示四个字节可以表示的正数值范围。

注意:这段代码假设十六进制输入是四个字节。您可能需要在生产代码中添加更多的检查和度量。

private static long toLong(String hex) {
    hex = hex.replace(" ", "") + "00000000";
    byte[] data = DatatypeConverter.parseHexBinary(hex);
    return ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN).getLong();
}
public static void main(String[] args) throws Exception {
    System.out.println(toLong("54 00 00 00"));
    System.out.println(toLong("55 F1 2E 04"));
    System.out.println(toLong("A2 3F 32 01"));        
    System.out.println(toLong("FF FF FF FF"));
}
输出:

<>之前8470185301200703064294967295之前

基于你最近的编辑,我建议一些代码如下。注意,它假设输入的长度是四个字节的倍数。任何剩余的字节将被忽略:

File input = new File("whatever");
byte[] buffer = new byte[8];
List<Long> result = new ArrayList<>();
try (DataInputStream in = new DataInputStream(new FileInputStream(input))) {
    int count = 0;        
    // Note: any trailing bytes are ignored
    while (count < input.length() - 4) {
        in.readFully(buffer, 4, 4);
        result.add(ByteBuffer.wrap(buffer)
                .order(ByteOrder.LITTLE_ENDIAN).getLong());
        count += 4;
    }
}

您需要在组成int的4个字节内交换字节顺序。转换是对称的,所以当输入是小端序时,输出是大端序,反之亦然。

Big Endian:    12 34 56 78
Little Endian: 78 56 34 12

所以如果你在处理InputStream时这样做,读取四个字节,并将它们以相反的顺序写入输出。

最新更新