2015-04-15 11 views
6

wiem, że mogę wyodrębnić bajtów z int tak:Konkatenowanie bajtów do liczby całkowitej lub krótki zachowaniu znak

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

które następnie wysłać jako część transmisji szeregowej. Ale czy mogę zrobić odwrotnie, po otrzymaniu sekwencji bajtów, zrekonstruować oryginalne dane, zachowując znak. Obecnie robię to, ale czuję się nieco przesadzony:

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

Czy istnieje inny sposób lub lepszy sposób? Czy robi to różnicę, jeśli wiem, że ostatecznie mam do czynienia tylko z podpisanymi 16-bitowymi danymi?

+1

Czy to odpowiada na twoje pytanie? http://stackoverflow.com/questions/2538390/convert-16-bit-signed-int-to-2-bits –

+0

@josh BitConverter wygląda idealnie, pod warunkiem pozytywnego wyniku testu endian. – Graham

+0

'(int) BitConverter.ToInt16 (nowy [] {lo, cześć}, 0);' – Sinatr

Odpowiedz

2

Używasz tylko podpisanych danych 16-bitowych. Dlaczego więc przekazujesz (i powracasz) int, a nie short? Odrzucasz informacje o znaku, więc nie będzie on działał na liczby ujemne. Zamiast tego użyj short, a wszystko będzie dobrze - a dodatkowe informacje o typie zwiększą bezpieczeństwo Twojego kodu.

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)); 
} 

Główną zaletą (oprócz tego, że jaśniejsze i faktycznie pracy) jest to, że nie można już przejść nieprawidłową wartość metody. To zawsze jest dobre :)

Och, i zaleciłbym zachowanie symetryczności interfejsu - BytesToShort powinien również wziąć byte[] (lub inną strukturę, która ma dwa bajty).

+0

Powoduje to przepełnienie liczb ujemnych – Graham

+0

Nie, nie ma. Przetestowałem to pod kątem liczb ujemnych, a także losowego zestawu liczb. Czy może przełączasz 'hi' i' lo'? Kolejny powód użycia 'byte []' zarówno dla zwracanej wartości 'ShortToBytes' oraz' BytesToShort' :) – Luaan

+0

Interesujące. Dostaję przepełnienie za pomocą dowolnego połączenia z 'BytesToShort', gdzie wartość' hi> 127'. Może być różnica z zaznaczonym/niezaznaczonym ustawieniem – Graham

Powiązane problemy