Java中将字节数组转换为无符号整数

8

我正在将一个字节数组转换为int,方法如下:

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

但是它返回的是有符号数,而我需要无符号数,因为我想在加密期间将该数字作为整数发送到服务器并在服务器上解密。如果它是有符号数,我可以这样做。

请帮帮我……

venu


在Java中,所有整数类型(除了char)都是有符号的。 - mob
你使用什么协议?如果你向服务器发送某些内容,那么这个“内容”以及它的发送方式是很重要的,而不是你内部的表示方式。我认为,你的问题应该是这样的:“我如何使用corba/RMI/Hessian/t3/iiop/http/.....发送无符号数字?” - dz.
4个回答

12

在Java中,int始终是一个32位带符号数字。但这只有在进行数学计算时才会有影响。如果你只关心0和1位的模式,则可以忽略符号。

如果需要进行一些数学运算,则通过掩码将其转换为long

long l = j & 0xFFFFFFFFL;

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


太棒了!非常准确和有帮助! - Oz Shabat

7

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

要进行32位无符号算术运算,只需假装“int”是无符号的进行算术运算即可。例如,2 ** 31-1是最大的(有符号的)int值。如果你将其加一,你会得到-2 ** 31。但是如果你认为int是无符号的,那么该位模式与+2 ** 31是相同的。减法和乘法也是如此。(我不确定除法和余数,但这对你来说可能并不重要)。

比较无符号的32位值有点棘手。例如,-1小于+1,但是如果你将-1解释为一个无符号值,你会得到+2 ** 32-1,它应该比“+1”更大。你可以通过翻译不等式(我将让读者自己想出来)或将int值转换为long,用0xffffffffL屏蔽它们并将它们作为长整型进行比较来进行补偿;例如:

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

将32位无符号整数转换为字符串最简单的方法是使用longs,例如:

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

我必须承认,使用int来表示32位无符号值是棘手且潜在易错的。更清晰的解决方案是在整个应用程序中使用long,或者如果您的应用程序需要64位无符号值,则使用BigInteger


更新 - 看起来Java 8将支持(以库方法的形式)将intlong视为无符号类型-请参见Oracle的Joseph Darcy的“JDK 8中现在有无符号整数算术API”


请参见 https://dev59.com/pHRC5IYBdhLWcg3wJNgN#397997 - starblue

0

数组中的每个单元格都被视为无符号整数:

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

-4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接