Domanda

Qual è il modo migliore per dividere un numero intero a 32 bit in quattro caratteri (non firmati) in C #.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top