Question

Quel est le meilleur moyen de diviser un entier 32 bits en quatre caractères (non signés) en C #.

Était-ce utile?

La solution

Quick'n'dirty:

int value = 0x48454C4F;
Console.WriteLine(Encoding.ASCII.GetString(
  BitConverter.GetBytes(value).Reverse().ToArray()
));

Conversion de l'entier en octets, inversion du tableau d'octets pour obtenir le bon ordre, puis extraction de la représentation en caractères ASCII.

EDIT: la méthode Reverse est une méthode d'extension de .NET 3.5, juste pour info. Inverser l’ordre des octets peut également ne pas être nécessaire dans votre scénario.

À la vôtre David

Autres conseils

Char? Peut-être recherchez-vous cette petite fonction d'aide pratique?

Byte[] b = BitConverter.GetBytes(i);
Char c = (Char)b[0];
[...]

Ce n'est pas clair si c'est vraiment ce que vous voulez, mais:

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

Cela suppose que vous voulez que les octets soient interprétés comme la plage de caractères Unicode la plus basse.

Je l'ai essayé de plusieurs façons et j'ai chronométré le temps de conversion de 1000000 ints.

Méthode de conversion intégrée, 325 000 ticks:

Encoding.ASCII.GetChars(BitConverter.GetBytes(x));

Conversion de pointeur, 100 000 ticks:

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

Décalage de bits, 77 000 ticks:

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

Obtenez les blocs de 8 octets:

int a = i & 255; // bin 11111111
int b = i & 65280; // bin 1111111100000000

Ne divisez pas les trois premiers octets en un seul octet, divisez-les simplement par le nombre approprié et effectuez une autre logique pour obtenir votre dernier octet.

Edit: la solution de Jason avec les bitshifts est bien sûr bien plus agréable.

Convertisseur de bits

.net utilise Unicode, un caractère est composé de 2 octets et non de 1

Pour convertir des données binaires contenant du texte non-unicode, utilisez la classe System.Text.Encoding.

Si vous voulez 4 octets et non des caractères, remplacez le caractère par octet dans la réponse de Jason

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top