2009-10-16 17 views
7

sto conversione di un array di byte in int in questo modo:array di byte a unsigned int in Java

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

ma restituisce un numero con segno dove voglio un numero senza segno, perché voglio inviare quel numero al server come numero intero durante la crittografia e deve decrittografarlo sul server. se è un numero firmato posso farlo.

si prega di qualsiasi aiuto 1 me ..........

venu

+0

In Java tutti i tipi interi (eccetto char) sono firmato. – mob

+0

Che protocollo usi? Se invii qualcosa al server, il "qualcosa" e come viene inviato è importante, non la tua rappresentazione interna. Penso che la tua domanda dovrebbe essere: "Come faccio a inviare numeri senza segno usando corba/RMI/Hessian/t3/iiop/http/.....?" –

risposta

-1

Java non ha unsigned int, quindi dovrete invertire manualmente i bit per ottenere un valore senza segno se hai assolutamente bisogno di averne uno

Got this from Google.

+0

Pagina non trovata !!! –

6

Un int è sempre un numero firmato a 32 bit in Java. Tuttavia, questo conta solo se stai facendo matematica con esso. Se tutto quello che ti interessa è il modello di 0 e 1 bit, ignora semplicemente il segno.

Se si ha bisogno di fare un po 'di matematica, convertirlo in un long dal mascheramento:

long l = j & 0xFFFFFFFFL; 

fare tutto l'aritmetica con long operandi, modulo 0xFFFFFFFFL. Al termine, restituire il risultato a int e trasmetterlo.

7

I tipi interi primitivi di Java (cioè byte, short, int e long) sono tutti firmati. Ma puoi aggirare questo.

Per fare (dire) aritmetica senza segno a 32 bit, basta fare l'aritmetica fingendo che 'int' non sia firmato. Ad esempio, 2**31 - 1 è il più grande (firmato) valore int. Se ne aggiungi uno, otterrai -2**31. Ma quel modello di bit è lo stesso di +2**31 se pensi allo int come non firmato. Questo funziona anche per la sottrazione e la moltiplicazione. (Non sono sicuro della divisione e del resto, ma è probabile che non sia importante per te).

Il confronto dei valori a 32 bit senza segno è un po 'più complicato. Ad esempio, -1 è inferiore a +1, ma se interpreti -1 come valore senza segno ottieni +2**32 - 1 che dovrebbe essere maggiore di "+1". È possibile compensare traducendo la disuguaglianza (lascerò il lettore al computer per capirlo) o convertendo i valori int in long, mascherandoli con 0xffffffffL e confrontandoli come lunghi; per esempio.

int u1 = ... 
int u2 = ... 
if ((((long) u1) & 0xffffffff) < (((long) u2) & 0xffffffff) { 
    // u1 represents a smaller unsigned value than u2 
} 

Conversione di numeri interi senza segno a 32 bit in Stringhe è un'operazione più semplice che si esegue utilizzando i caratteri lunghi; per esempio.

String str = Long.toString(((long) u1) & 0xffffffffL); 

ora mi liberamente ammettere che l'uso int per rappresentare 32 bit valori senza segno è difficile, e potenzialmente soggetto a errori. Una soluzione più pulita sarebbe quella di utilizzare long in tutto o se l'applicazione richiede valori senza segno a 64 bit per utilizzare BigInteger.


UPDATE - sembra Java 8 avrà il supporto (sotto forma di metodi di libreria) per il trattamento di int e long tipi senza segno - vedere "Unsigned Integer Arithmetic API now in JDK 8" da Joseph Darcy @ Oracle.

+0

Vedere anche http://stackoverflow.com/questions/397867/port-of-random-generator-from-c-to-java/397997#397997 – starblue

0

Ogni cella nella matrice viene trattato come 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; 
} 
  • Il codice convertirà [12,34] a 1234