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)来处理intlong作为无符号类型 - 请参阅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,因此如果你绝对需要,那么你必须手动反转这些位以获得无符号值。

来自谷歌 。