2015-04-15 12 views
6

so di poter estrarre byte da int simili:Concatenare byte in numero intero o breve conservazione segno

bytes[] IntToBytes(int i) 
{ 
    return new byte [] {(byte) ((i >> 8) & 0xff), (byte) (i & 0xff)}; 
} 

quale successivamente mando come parte di una trasmissione seriale. Ma posso fare il contrario, dopo aver ricevuto una sequenza di byte, ricostruire i dati originali, preservando il segno. Attualmente, faccio questo, ma ci si sente un po 'sopra le righe:

int BytesToInt(byte hi, byte lo) 
{ 
    return ((hi << 24) | (lo << 16)) >> 16; 
} 

C'è un altro modo o in un modo migliore? Fa la differenza se so che alla fine ho a che fare solo con i dati a 16 bit con segno?

+1

Questo risponde alla tua domanda? http://stackoverflow.com/questions/2538390/convert-16-bit-signed-int-to-2-bytes –

+0

@josh BitConverter sembra ideale, soggetto a superare il test di endian. – Graham

+0

'(int) BitConverter.ToInt16 (nuovo [] {lo, ciao}, 0);' – Sinatr

risposta

2

Si sta lavorando solo con dati a 16 bit con segno. Quindi, perché stai passando (e restituendo) uno int e non uno short? Stai buttando via le informazioni sul segno, quindi in realtà non funzionerà con numeri negativi. Invece, usa short e starai bene - e le informazioni sul tipo extra renderanno il tuo codice più sicuro.

byte[] ShortToBytes(short i) 
{ 
    return new byte [] {(byte) ((i >> 8) & 0xff), (byte) (i & 0xff)}; 
} 

short BytesToShort(byte hi, byte lo) 
{ 
    return unchecked((short)((hi << 8) | lo)); 
} 

Il principale vantaggio (oltre ad essere più chiari ed effettivamente lavorando ) è che non è più possibile passare un valore valido al metodo. È sempre buono :)

Oh, e mi raccomando di mantenere l'interfaccia simmetrica - BytesToShort dovrebbe anche prendere uno byte[] (o qualche altra struttura che ha i due byte).

+0

Ciò causa un overflow con numeri negativi – Graham

+0

No, non lo è. L'ho testato per numeri negativi, oltre a un insieme casuale di numeri. Stai forse passando 'hi' e' lo'? Un altro motivo per usare 'byte []' sia per il valore di ritorno di 'ShortToBytes' e' BytesToShort' :) – Luaan

+0

Interessante. Ottengo overflow con qualsiasi chiamata a 'BytesToShort' dove valore di' hi> 127'. Potrebbe fare la differenza con l'impostazione selezionata/deselezionata – Graham

Problemi correlati