我正在将一个字节数组转换为int
,方法如下:
ByteArrayInputStream bais = new ByteArrayInputStream (data);
DataInputStream dis = new DataInputStream (bais);
int j = dis.readInt();
但是它返回的是有符号数,而我需要无符号数,因为我想在加密期间将该数字作为整数发送到服务器并在服务器上解密。如果它是有符号数,我可以这样做。
请帮帮我……
venu
我正在将一个字节数组转换为int
,方法如下:
ByteArrayInputStream bais = new ByteArrayInputStream (data);
DataInputStream dis = new DataInputStream (bais);
int j = dis.readInt();
但是它返回的是有符号数,而我需要无符号数,因为我想在加密期间将该数字作为整数发送到服务器并在服务器上解密。如果它是有符号数,我可以这样做。
请帮帮我……
venu
在Java中,int
始终是一个32位带符号数字。但这只有在进行数学计算时才会有影响。如果你只关心0和1位的模式,则可以忽略符号。
如果需要进行一些数学运算,则通过掩码将其转换为long
:
long l = j & 0xFFFFFFFFL;
使用long
操作数进行所有算术运算,模0xFFFFFFFFL。 完成后,将结果强制转换回int
并传输它。
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将支持(以库方法的形式)将int
和long
视为无符号类型-请参见Oracle的Joseph Darcy的“JDK 8中现在有无符号整数算术API”。
数组中的每个单元格都被视为无符号整数:
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;
}