gpt4 book ai didi

Java:将 "unsigned"字节转换为 int 的正确方法

转载 作者:搜寻专家 更新时间:2023-10-31 19:46:22 26 4
gpt4 key购买 nike

我花了几个小时寻找 third-party implementation of stream cipher Rabbit 中的错误.有几个错误,但其中一个是:

/**
* @param IV An array of 8 bytes
*/
public void setupIV(final byte[] IV) {
short[] sIV = new short[IV.length>>1];
for(int i=0;i<sIV.length;++i) {
sIV[i] = (short)((IV[i << 1] << 8) | IV[(2 << 1) + 1]);
}
setupIV(sIV);
}

这里的问题是字节IV[i << 1]被转换到 int , 但由于 Java 没有无符号类型,任何值 >= 0x80投错了。说,字节0xff变成 0xffffffff , 不是 0x000000ff上面代码的作者是如何预期的。

所以我添加了简单的功能:

   private int byte2int(byte b){
int ret = b;
if (ret < 0){
ret += 256;
}
return ret;
}

它有效,但我想知道这是否是满足我需要的正确方法?这个解决方案似乎有些愚蠢。

最佳答案

我不确定这会有多大帮助,但您可以通过使用 0xFF 运行二进制 AND 运算将有符号字节转换为其无符号值.

进一步采用此逻辑,您可以通过使用适当的操作数对 int 运行类似的 AND 来检查强制转换后是否存在溢出。这当然假设您总是期望正数或零值数字,或者换句话说无符号数。

(short)(((IV[i << 1] & 0xFF) << 8) | (IV[(2 << 1) + 1] & 0xFF))

以上是将所有内容放在一起的结果,由 Radiodef 提供。

关于Java:将 "unsigned"字节转换为 int 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20776371/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com