2010-10-12 15 views
7

Come posso convertire un int a due byte in C#?Come posso convertire un int a due byte in C#?

+0

Quale parte della int? Due byte non sono sufficienti per codificare un intero valore intero a 32 bit. – dtb

+1

'int' richiede 4 byte per la memorizzazione. Desideri perdere le informazioni negli MSB? –

+0

Chi il * beep * ha downvotato questo valore. Questa è una domanda utile e interessante in quanto il modo C non funziona a buon diritto in C# e le API ovvie non esistono (BitConverter è lento e * rotto * in molti modi). – Joshua

risposta

11

Dando per scontato che desidera solo i byte bassi:

byte b0 = (byte)i, 
    b1 = (byte)(i>>8); 

Tuttavia, dal momento che 'int' è 'Int32' che lascia altre 2 byte non catturate.

+0

Questa è la mia soluzione. Molto deve essere più veloce di BitConverter. – Joshua

+5

@Joshua, ho fatto un rapido benchmark (versione di rilascio, 50000000 iterazioni, cronometro e test completo ripetuti due volte per rimuovere vari artefatti) e la differenza tra la creazione di un array e l'utilizzo del bit-masking contro la chiamata di BitConverter è di circa 1ns per chiama la mia macchina. Se rimuovi la creazione dell'array (ottieni solo i due byte), la differenza è di circa 14ns. –

+0

Non dubito dei vostri parametri di riferimento. BitConverter è lento in confronto perché deve allocare gli array. Se riesco a pre-rilevare la dimensione del mio array per migliaia di interi, posso risparmiare una quantità di tempo non banale. – Joshua

4

È possibile utilizzare BitConverter.GetBytes per ottenere i byte che comprendono un Int32. Ci saranno 4 byte nel risultato, tuttavia, non 2.

2

Un altro modo per farlo, anche se non così liscia come altri metodi:

Int32 i = 38633; 
byte b0 = (byte)(i % 256); 
byte b1 = (byte)(i/256); 
2

È un Int16?

Int16 i = 7; 
byte[] ba = BitConverter.GetBytes(i); 

Questo avrà solo due byte in esso.