Come convertire il numero intero a 16 bit con segno intero a 16 bit senza segno in Java?

Ho il mio layout di sotto in cui ho bisogno di rappresentare i miei dati e poi finalmente ho bisogno di fare un array di byte fuori da quello. Ho bisogno di rappresentare i miei dati nel formato seguente dal codice Java e quindi inviare l’array di byte al mio programma C ++ che a sua volta il programma c ++ decomprime l’array di byte ed estrae il materiale pertinente da esso –

// below is my data layout - // // key type - 1 byte // key len - 1 byte // key (variable size = key_len) // timestamp (sizeof uint64_t) // data size (sizeof uint16_t), this is unsigned 16-bit integer. // data (variable size = data size) 

Così ho iniziato così in Java, che funziona bene su un caso d’uso semplice che crea una matrice a byte singolo, ma penso che il mio calcolo dataSize sia sbagliato poiché sto usando Short per dataSize che può assumere il valore massimo come 32767 ma dataSize la specifica è uint16_t come mostrato sopra, che è un numero intero a 16 bit senza segno che può assumere un valore massimo superiore a 32767 .

 byte keyType = 101; byte keyLength = 3; byte[] key = {27, 55, 111}; long timestamp = System.currentTimeMillis(); byte[] data = "string data".getBytes("UTF-8"); // this is looking wrong to me since dataSize is uint16_t in my C++ specifications as shown above short dataSize = (short) data.length; int totalSize = (1 + 1 + keyLength + 8 + 2 + dataSize); ByteBuffer bytes = ByteBuffer.allocate(totalSize); bytes.put(keyType); bytes.put(keyLength); bytes.put(key); bytes.putLong(timestamp); // so this is also wrong // what is the right way to send the dataSize? bytes.putShort(dataSize); bytes.put(data); // write everthing as a single byte array: byte[] byteArray = bytes.array(); 

Diciamo che se la lunghezza dei dati è 37714 (data.length), dataSize arriverà come -27822 negativo.

Quindi la mia domanda è: c’è un modo per avere un intero 16 bit senza segno in java che posso usare nel mio codice precedente o in qualche modo per lanciarlo?

Il mio codice sopra sembra corretto con le specifiche di cui sopra o c’è qualcosa di sbagliato che potrebbe causare problemi se avessimo delle grandi stringhe in arrivo.

Il solo tipo unsigned di Java è char e sembra essere largo 16 bit. Tuttavia, questa non è la scelta giusta per rappresentare la lunghezza: dovresti usare int internamente e convertire in / da short a 16 bit solo durante la serializzazione e la deserializzazione.

 int dataSize = data.length; ... bytes.putShort((short)(dataSize & 0xFFFF)); 

e

 short tmp = getShort(...); int dataSize = ((int)tmp) & 0xFFFF; 

0xFFFF è una “maschera” a 16 bit che taglia i bit indesiderati di un int . Notare che se tmp risulta negativo durante la deserializzazione, il mascheramento lo renderà di nuovo positivo, producendo il valore che ti è stato inviato.