java中的字节数组为unsigned int
我通过这样做将一个字节数组转换为int
:
ByteArrayInputStream bais = new ByteArrayInputStream (data); DataInputStream dis = new DataInputStream (bais); int j = dis.readInt();
但它返回一个带符号的数字,我想要一个无符号数,因为我希望在加密期间将该数字作为整数发送到服务器,并且必须在服务器上解密它。 如果是签名号码,我可以这样做。
请任何1帮助我……….
VENU
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
掩盖它们并将它们作为long进行比较; 例如
int u1 = ... int u2 = ... if ((((long) u1) & 0xffffffff) < (((long) u2) & 0xffffffff) { // u1 represents a smaller unsigned value than u2 }
使用longs最简单地将32位无符号整数转换为字符串; 例如
String str = Long.toString(((long) u1) & 0xffffffffL);
现在,我将自由地承认,使用int
来表示32位无符号值是棘手的,并且可能容易出错。 一个更干净的解决方案是在整个过程中使用long
,或者如果您的应用程序需要64位无符号值来使用BigInteger
。
更新 - 看起来Java 8将支持(以库方法的forms)来处理int
和long
作为无符号类型 - 请参阅Joseph Darcy @ Oracle的“现在在JDK 8中的无符号整数算术API” 。
int
始终是Java中带符号的32位数字。 但是,这只在您使用它进行数学计算时才有意义。 如果你关心的只是0和1位的模式,那么只需忽略符号。
如果你确实需要做一些数学计算,请通过屏蔽将其转换为long
:
long l = j & 0xFFFFFFFFL;
使用long
操作数进行所有算术运算,模数为0xFFFFFFFFL。 完成后,将结果转换回int
并传输它。
数组中的每个单元格都被视为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
Java没有unsigned int,因此如果你绝对需要,那么你必须手动反转这些位以获得无符号值。
来自谷歌 。