Conversione da 32 bit interi a 4 caratteri
Domanda
Qual è il modo migliore per dividere un numero intero a 32 bit in quattro caratteri (non firmati) in C #.
Soluzione
frettoloso e approssimativo:
int value = 0x48454C4F;
Console.WriteLine(Encoding.ASCII.GetString(
BitConverter.GetBytes(value).Reverse().ToArray()
));
Convertire int in byte, invertendo l'array di byte per l'ordine corretto e quindi ottenendo la rappresentazione del carattere ASCII da esso.
EDIT: il metodo Reverse è un metodo di estensione da .NET 3.5, solo per informazioni. Anche invertire l'ordine dei byte potrebbe non essere necessario nel tuo scenario.
Saluti, David
Altri suggerimenti
Char? Forse stai cercando questa utile piccola funzione di aiuto?
Byte[] b = BitConverter.GetBytes(i);
Char c = (Char)b[0];
[...]
Non è chiaro se questo è davvero quello che vuoi, ma:
int x = yourNumber();
char a = (char)(x & 0xff);
char b = (char)((x >> 8) & 0xff);
char c = (char)((x >> 16) & 0xff);
char d = (char)((x >> 24) & 0xff);
Ciò presuppone che i byte vengano interpretati come l'intervallo più basso di caratteri Unicode.
L'ho provato in alcuni modi e ho registrato il tempo impiegato per convertire 1000000 ints.
Metodo di conversione incorporato, 325000 tick:
Encoding.ASCII.GetChars(BitConverter.GetBytes(x));
Conversione puntatore, 100000 tick:
static unsafe char[] ToChars(int x)
{
byte* p = (byte*)&x)
char[] chars = new char[4];
chars[0] = (char)*p++;
chars[1] = (char)*p++;
chars[2] = (char)*p++;
chars[3] = (char)*p;
return chars;
}
Cambio bit, 77000 tick:
public static char[] ToCharsBitShift(int x)
{
char[] chars = new char[4];
chars[0] = (char)(x & 0xFF);
chars[1] = (char)(x >> 8 & 0xFF);
chars[2] = (char)(x >> 16 & 0xFF);
chars[3] = (char)(x >> 24 & 0xFF);
return chars;
}
Ottieni i blocchi da 8 byte:
int a = i & 255; // bin 11111111
int b = i & 65280; // bin 1111111100000000
Suddividi i primi tre byte in un singolo byte, dividerli per il numero corretto ed esegui un altro logico e ottieni il tuo byte finale.
Modifica: la soluzione di Jason con i bit-shift è ovviamente molto più gradevole.
BitConverter
.net usa Unicode, un carattere è 2 byte non 1
Per convertire tra dati binari contenenti testo non unicode, utilizzare la classe System.Text.Encoding.
Se vuoi 4 byte e non caratteri, sostituisci il carattere con byte nella risposta di Jason