我有一个定义良好的二进制数据,我想为它编写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;
}
答案 0 :(得分:2)
在你的中读取它们为short
(2字节 - Java)和int
(4字节 - Java)
Java代码。你不会丢失任何信息。如果您需要稍后输出,
进行转换,以便不输出带符号的数字。
鉴于他们的名字:File Source ID
和Header Size
我怀疑你
将对它们进行任何算术运算。如果你这样做,请小心。
或者,您可以在long
(Java中的8个字节)中读取它们
而不用担心算术运算,因为它们不会引起问题。
或者,您可以在Java中将您的值读取为字节数组,
然后将它们转换为Java代码中的正确类型
这可能是最明确和最干净的解决方案
但它需要更多编码。
答案 1 :(得分:2)
DataInputStream以Big Endian方向读取字节,但检查出来:
3288596480 = 0xC4040000
反转字节,得到0x04C4 = 1220
您只需阅读Little Endian中的值即可。关于这个标志的问题原来是一个红色的鲱鱼。