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

标签 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 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/

相关文章:

java - GWT 复合小部件

c++ - 我应该如何在 API 中替换 vector<uint8_t>::const_iterator?

.net - 在不加载整个字段的情况下确定 blob 是否是图像?

python - 如何从十六进制转换为摘要,反之亦然?

c# - 在二进制序列化期间更改程序集名称

java - Observable from iterable 不会打印所有元素

java - Java 1.5 的 JStack?

Java/Spring模型表单框架

java - AsyncTask 回调不调用

c++ - 有没有一种正统的方法来避免编译器警告 C4309 - "truncation of constant value"与二进制文件输出?