我通过这样做将一个字节数组转换为int
:
ByteArrayInputStream bais = new ByteArrayInputStream (data);
DataInputStream dis = new DataInputStream (bais);
int j = dis.readInt();
但它返回一个带符号的数字,我想要一个无符号数,因为我想在加密期间将该数字作为整数发送到服务器,并且必须在服务器上解密它。如果是签名号码,我可以这样做。
请任何1帮助我..........
venu
答案 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将支持(以库方法的形式)将int
和long
视为无符号类型 - 请参阅"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;
}
答案 3 :(得分:-2)
Java没有unsigned int,所以如果你绝对需要一个无符号的值,你必须手动反转这些位。