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

Java:解析无符号二进制数据,java,binary-data,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 我正在使用DataInput

我有一个定义良好的二进制数据,我想为它编写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;
}

在你的
Java代码。您不会丢失任何信息。如果以后需要输出它们,
进行转换,这样就不会输出有符号的数字。

给出他们的名字:
文件源ID
标题大小
我怀疑你
将对它们执行任何算术运算。如果你这样做了,小心点

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

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

但它需要更多的编码。

DataInputStream以大端方向读取字节,但请检查以下内容:

3288596480=0xC4040000

颠倒字节,得到0x04C4=1220


您只需读取Little Endian中的值。关于这个标志的问题原来是在转移注意力。

你需要对他们做一些数学计算吗?你需要一个8字节的无符号整数吗?显而易见的答案是将它们读入有符号整数,例如,您的4字节无符号长适合Java long。在任何现代系统中,无符号长都不会是4字节。除此之外,由于Java提供了一个8字节的带符号长,这就涵盖了它@彼得·彼得罗夫:对不起,只要看不起作用,就会给我负面的印象。我很困惑,long需要8个字节,但是头大小是4个字节,这是否意味着我增加了4个额外的字节?@Saddy_Grade不确定您到底在尝试什么,但我建议您阅读“文件源ID”和“头大小”是字节数组。然后从它们构造长值。请看这里:@peter.petrov:我使用了
readLong()&0xffffffffffl
。它给了我一个正数,但不是正确的数字。不仅仅是4。如果要读取4个字节,请使用readInt()并使用位掩码将结果转换为正长。在解析二进制文件时,我通常处理Double的方法是使用现有的方法读取一个long(是的,您可以反转),然后调用Double.longBitsToDouble将long转换为Double。