【发布时间】:2014-01-31 02:50:31
【问题描述】:
我有一个定义明确的二进制数据,我想为它编写 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 版本来读取数据。
已解决
我不确定我能否回答我自己的问题。哈哈
无论如何,这是解决方案。
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;
}
【问题讨论】:
-
您需要对它们进行某种数学运算吗?你需要一个 8 字节的无符号整数吗?显而易见的答案是将它们读入有符号整数,例如您的 4 字节无符号长整数适合 Java 长整数。
-
unsigned long 在任何现代系统上都不会是 4 个字节。除此之外,由于 Java 提供了 8 字节的有符号长度,因此涵盖了它。
标签: java binary-data