如何将原始图像转换为带符号的32位

时间:2014-06-19 16:21:59

标签: java hex bytearray signed endianness

我有一个用dd命令创建的文件(原始文件)。我打开它,如下图所示:

Bless

现在我想从这个文件中提取数据并获得在32位下出现的内容(如果你看到图像84是我想要的数字)。因此,我想以这种方式转换以下字符串:

10 00 00 00 --> 84
54 00 00 00 --> 70185301

为了进行这种转换,我构建了以下程序,该程序打开文件,解码行并将结果写入新文件。

以下是进行提取的代码段(@Duncan帮助我创建它):

try
  {

    File input = new File(inputFileField.getText());
    File output = new File(fileDirectoryFolder.getText() +"/"+ input.getName());

    byte[] buffer = new byte[8];         
    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;
     }
   }
   System.out.println("Done"); 

}
catch(FileNotFoundException e1){}

然而,我得到的结果是

10 00 00 00 --> 68719476736 
54 00 00 00 --> 360777252864

你明白我的问题在哪里吗?

由于

1 个答案:

答案 0 :(得分:2)

String s= 
Integer.toString(
   ByteBuffer.wrap(buffer).order(ByteOrder.LITTLE_ENDIAN).getInt());

Long有8个字节,你只想转换4个。

并且不使用偏移量

in.readFully( buffer, 0, 4 );

$ echo $[0x1000000000]
68719476736
$ echo $[0x5400000000]
360777252864

这是由于读取时4个字节的(不正确)偏移。

另一个,应该纠正:

 while (count < input.length() - 3) {