2009-10-16 80 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
相關問題