2009-10-16 82 views
7

我转换一个字节数组转换为int通过这样做:字节数组unsigned int类型在Java中

ByteArrayInputStream bais = new ByteArrayInputStream (data); 
DataInputStream dis = new DataInputStream (bais); 
int j = dis.readInt(); 

但它返回一个有符号数,我想一个无符号数,因为我要发送数在加密过程中以整数形式发送到服务器,并且必须在服务器上解密。如果它是一个有签名的号码,我可以做到这一点。

请任何1帮我..........

VENU

+0

在Java所有整数类型(除焦)是签。 – mob 2009-10-16 06:20:14

+0

你使用什么协议?如果你向服务器发送了某些东西,它的发送方式很重要,而不是你的内部表示。我想,你的问题听起来应该是这样的:“我如何使用corba/RMI/Hessian/t3/iiop/http/.....发送无符号数字?” – 2009-10-16 06:47:04

回答

-1

Java没有无符号整数,所以你必须手动反转位得到一个无符号值如果你绝对需要有一个。

Got this from Google

+0

找不到页面!!! – 2016-02-08 13:33:29

6

int始终是Java中有符号的32位数字。但是,如果你正在做数学运算,这才重要。如果你关心的只是0和1比特的模式,那么就忽略这个符号。

如果你确实需要做一些数学,它通过屏蔽转换为long

long l = j & 0xFFFFFFFFL; 

是否所有的运算与long操作数,模0xFFFFFFFFL。完成后,将结果转换回int并发送。

7

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


UPDATE - 它看起来的Java 8将支持(在库法的形式),用于治疗intlong为无符号类型 - 见"Unsigned Integer Arithmetic API now in JDK 8"由约瑟夫·达西@甲骨文。

+0

参见http://stackoverflow.com/questions/397867/port-of-random-generator-from-c-to-java/397997#397997 – starblue 2009-10-16 07:04:48

0

阵列中的每个小区被视为无符号整型:

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
相关问题