【问题标题】:Convert DWORD byte array to a unsigned long number将 DWORD 字节数组转换为无符号长整数
【发布时间】:2016-09-07 15:09:31
【问题描述】:

我想要一个 little-endian DWORD 字节数组的无符号值。

这是我写的:

private long getUnsignedInt(byte[] data) {
        long result = 0;
        for (int i = 0; i < data.length; i++) {
            result += (data[i] & 0xFF) << 8 * (data.length - 1 - i);
        }
        return result;
}

对吗?

【问题讨论】:

  • 它是否为您提供了您期望的值?
  • 我测试的是肯定的,但我不明白这是否是“二进制补码”安全的。
  • 不错的投票者,也许我不应该发布代码而只发布问题?
  • @Kayaman 我的意思是“二进制补码”(我错了,我编辑了我的评论)表示负数
  • 我知道二进制补码是什么,但我不知道“二进制补码”安全应该是什么意思。尤其是当你在谈论无符号数字时。

标签: java bytearray unsigned


【解决方案1】:

不,我担心这是大端。

public long readUInt(byte[] data) {
    // If you want to tackle different lengths for little endian:
    //data = Arrays.copyOf(data, 4);
    return ByteBuffer.wrap(data)
        .order(ByteOrder.LITTLE_ENDIAN)
        .getInt() & 0xFF_FF_FF_FFL;
}

上面做了一个 4 字节到(有符号的)int 转换,然后使其无符号。

【讨论】:

    【解决方案2】:

    为 BigEndian 更正

    如果你的 DWORD 是指 32 位无符号整数,试试这个

        public long readUInt(byte[] data) {
                return (
                    ((long)(data[3] & 0xFF) << 24) |
                    ((long)(data[2] & 0xFF) << 16) |
                    ((long)(data[1] & 0xFF) << 8) |
                    ((long)(data[0] & 0xFF) << 0));
        }
    

    Joop Eggen 的回答是正确的,我认为这个更快,因为没有对象分配。

    【讨论】:

    • 谢谢,我写了一个循环,因为我想灵活地处理可变字节长度,也许我应该检查一下不要超过 long 的长度。
    • 这是 big-endian,而不是 little-endian,正如 Joop 在 his answer 中提到的那样。
    • 是的,你应该反转移位值
    • 为 BigEndian 编辑
    猜你喜欢
    • 2014-03-28
    • 1970-01-01
    • 2013-06-18
    • 2012-02-17
    • 2012-05-10
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 2018-04-07
    相关资源
    最近更新 更多