【问题标题】:C /C++ long long to Java longC /C++ long long 到 Java long
【发布时间】:2011-02-09 12:25:06
【问题描述】:

我在磁盘上有一个文件,我正在读取它是由 c/c++ 代码编写的。我知道我有两个 64 位无符号整数要读取,但 Java 不支持无符号整数,所以当我执行 DataInputStream.readLong() 时得到的值不正确。 (暂时忽略字节顺序,我实际上使用的是 DIS 的衍生产品,称为 LEDDataInputStream,它是从网上下载的)

这里的很多帖子都在谈论使用 BigInteger,但用于读取 bytearray 的 javadoc 只谈论加载 bytearray 表示,问题似乎集中在一些人超出了 java long 类型的正边界这一事实上,而我正在阅读的数据将远远不及。

我有一个 MATLab/Octave 脚本,它将这些 long long 值分别读取为两个 32 位整数,然后进行一些乘法和加法运算以得到它想要的答案。

我想问题是 - 我如何使用 BigInteger 或使用 [LE]DataInputStream.XXX 读取 64 位无符号整数?

提前致谢

【问题讨论】:

    标签: java biginteger uint64


    【解决方案1】:

    我建议使用ByteBuffer,然后使用this 之类的代码来获得你想要的。

    【讨论】:

    • 这看起来很有希望,但我需要自己实现读取长类型的功能(因为那里没有读取无符号长类型的方法)并将其放入 BigInteger。我已经接受了这个作为官方答案,因为它最接近我想要的
    【解决方案2】:

    您可以使用 long 作为 64 位值来存储无符号数据。这是一个模块,显示大多数Unsigned 操作可以使用标准long 类型执行。这实际上取决于您想对该值做什么,这是否是问题。

    编辑:处理无符号数的常用方法是扩展数据类型。这在许多情况下更简单,但不是必需的(对于long,使用BigInteger 不会让事情变得更简单恕我直言)

    EDIT2:下面的代码有什么问题?

    long max_unsigned = 0xFFFFFFFFFFFFFFFFl;
    long min_unsigned = 0;
    System.out.println(Unsigned.asString(max_unsigned) + " > "
            + Unsigned.asString(min_unsigned) + " is "
            + Unsigned.gt(max_unsigned, min_unsigned));
    

    打印

    18446744073709551615 > 0 is true
    

    【讨论】:

    • 不幸的是,这并不能完全回答我的查询——我拥有的数据已经在磁盘上,不是我写的,所以我不能像我读它时那样只使用签名的 java 类型从磁盘绝对值是错误的!
    • @James,但这是怎么回事,你能做点什么吗?我会说你可以,没有太多复杂性。恕我直言,这似乎是不可能的,因为您还没有考虑过。
    • @James,我添加了一个显示值没有错误的示例。
    【解决方案3】:

    首先你检查this question

    另见this

    现在使用 BigInteger 类

    // Get a byte array
    byte[] bytes = new byte[]{(byte)0x12, (byte)0x0F, (byte)0xF0};
    
    // Create a BigInteger using the byte array
    BigInteger bi = new BigInteger(bytes);
    
    // Format to binary
    String s = bi.toString(2);      // 100100000111111110000
    
    // Format to octal
    s = bi.toString(8);             // 4407760
    
    // Format to decimal
    s = bi.toString();              // 1183728
    
    // Format to hexadecimal
    s = bi.toString(16);            // 120ff0
    if (s.length() % 2 != 0) {
        // Pad with 0
        s = "0"+s;
    }
    
    
    // Parse binary string
    bi = new BigInteger("100100000111111110000", 2);
    
    // Parse octal string
    bi = new BigInteger("4407760", 8);
    
    // Parse decimal string
    bi = new BigInteger("1183728");
    
    // Parse hexadecimal string
    bi = new BigInteger("120ff0", 16);
    
    // Get byte array
    bytes = bi.toByteArray();
    

    【讨论】:

      猜你喜欢
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 2021-05-13
      相关资源
      最近更新 更多