我有一个定义明确的二进制数据,我想为它编写 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 number。我该如何转换它? (请以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);
输出是
read 3288596480
我的预期数字是 1220
.我不知道写这个二进制记录的代码,可能是用c。我想要的只是编写一个 Java 版本来读取数据。
已解决
我不确定我能回答我自己的问题。哈哈
无论如何,这是解决方案。
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;
}
最佳答案
DataInputStream 以 Big Endian 方向读取字节,但检查一下:
3288596480 = 0xC4040000
反转字节,你得到 0x04C4 = 1220
您只需要阅读 Little Endian 中的值。关于标志的问题原来是转移注意力。
关于Java:解析无符号二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21072985/