java中的字节数组为unsigned int

时间:2009-10-16 06:07:31

标签: java

我通过这样做将一个字节数组转换为int

ByteArrayInputStream bais = new ByteArrayInputStream (data);
DataInputStream dis = new DataInputStream (bais);
int j = dis.readInt();

但它返回一个带符号的数字,我想要一个无符号数,因为我想在加密期间将该数字作为整数发送到服务器,并且必须在服务器上解密它。如果是签名号码,我可以这样做。

请任何1帮助我..........

venu

4 个答案:

答案 0 :(得分:8)

int始终是Java中带符号的32位数字。但是,这只有你用它做数学时才重要。如果你关心的只是0和1位的模式,那么只需忽略符号。

如果您确实需要进行一些数学计算,请通过屏蔽将其转换为long

long l = j & 0xFFFFFFFFL;

使用long操作数进行所有算术运算,模数为0xFFFFFFFFL。完成后,将结果转换回int并传输。

答案 1 :(得分:7)

Java的原始整数类型(即byte,short,int和long)都是有符号的。但你可以解决这个问题。

要做(例如)32位无符号算术,只需要算术假装'int'是无符号的。例如,2**31 - 1是最大(签名)int值。如果您添加一个,您将获得-2**31。但如果您认为+2**31是无符号的,那么该位模式与int相同。这也适用于减法和乘法。 (我不确定除法和余数,但是对你来说无关紧要)。

比较无符号的32位值有点棘手。例如,-1小于+1,但如果您将-1解释为无符号值,则+2**32 - 1应该大于“+1”。您可以通过翻译不平等(我将其留给读者来弄清楚)或将int值转换为long,使用0xffffffffL屏蔽它们并将它们比较为多头; e.g。

int u1 = ...
int u2 = ...
if ((((long) u1) & 0xffffffff) < (((long) u2) & 0xffffffff) {
    // u1 represents a smaller unsigned value than u2
}

使用longs最简单地将32位无符号整数转换为字符串; e.g。

String str = Long.toString(((long) u1) & 0xffffffffL);

现在我可以自由地承认,使用int来表示32位无符号值非常棘手,并且可能容易出错。更清晰的解决方案是在整个过程中使用long,或者如果您的应用程序需要64位无符号值来使用BigInteger


UPDATE - 看起来Java 8将支持(以库方法的形式)将intlong视为无符号类型 - 请参阅"Unsigned Integer Arithmetic API now in JDK 8"作者:Joseph Darcy @ Oracle。

答案 2 :(得分:0)

数组中的每个单元格都被视为unsigned int:

private int unsignedIntFromByteArray(byte[] bytes) {
    int res = 0;
    if (bytes == null)
        return res;

    for (int i = 0; i < bytes.length; i++) {
        res = (res *10) + ((bytes[i] & 0xff));
    }
    return res;
}
  • 代码会将[12,34]转换为1234

答案 3 :(得分:-2)

Java没有unsigned int,所以如果你绝对需要一个无符号的值,你必须手动反转这些位。

Got this from Google