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