Java:解析无符号二进制数据

时间:2014-01-12 09:05:59

标签: java binary-data

我有一个定义良好的二进制数据,我想为它编写Java API 文件格式类似于

File Signature     char[4]               4 bytes 
File Source ID     unsigned short        2 bytes
Header Size        unsigned long         4 bytes
Max                double                8 bytes

我正在使用DataInputStream来解析数据。 char很容易解析,没问题。但unsigned无法正确解析。
我知道Java没有无符号数。我该如何转换它? (请以unsigned long为例)。

修改

以下是我的代码:

File file = new File("lidar.las");

DataInputStream in= new DataInputStream(new FileInputStream(file));

in.skipBytes(6);

long read = (long) (in.readInt() & 0xFFFFFFFFL);

System.out.println("read " + read);


输出是

  

阅读3288596480

我的预期数字是1220  我不知道编写这个二进制记录的代码,可能是在c中。我想要的只是编写一个Java版本来读取数据。

解决
我不确定我能回答我自己的问题。 LOL
无论如何,这是解决方案。

private static int getSignedInt( final int unsignedInt ){

    ByteBuffer bb=ByteBuffer.allocate(1024*4);

    bb.putInt(unsignedInt).flip();

    int result =bb.order(ByteOrder.LITTLE_ENDIAN).getInt();
    bb.clear();

    return  result;
}

2 个答案:

答案 0 :(得分:2)

在你的中读取它们为short(2字节 - Java)和int(4字节 - Java) Java代码。你不会丢失任何信息。如果您需要稍后输出,
进行转换,以便不输出带符号的数字。

鉴于他们的名字:File Source IDHeader Size我怀疑你 将对它们进行任何算术运算。如果你这样做,请小心。

或者,您可以在long(Java中的8个字节)中读取它们 而不用担心算术运算,因为它们不会引起问题。

或者,您可以在Java中将您的值读取为字节数组,
然后将它们转换为Java代码中的正确类型 这可能是最明确和最干净的解决方案 但它需要更多编码。

答案 1 :(得分:2)

DataInputStream以Big Endian方向读取字节,但检查出来:

3288596480 = 0xC4040000

反转字节,得到0x04C4 = 1220

您只需阅读Little Endian中的值即可。关于这个标志的问题原来是一个红色的鲱鱼。