2008-09-23 5 views
5

Quelle est la meilleure façon de diviser un entier de 32 bits en quatre caractères (non signés) en C#.Conversion de l'entier 32 bits à 4 caractères

+0

Que voulez-vous attendre les caractères être? Interprétation ASCII des octets? –

+0

Voulez-vous dire chars ou octets? Les caractères sont des caractères individuels de texte dans un codage donné, ce qui peut correspondre à plusieurs octets - probablement pas ce que vous voulez. –

Répondre

7

quick'n'dirty:

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

Conversion int en octets, en inversant l'octet tableau pour l'ordre correct et obtenir la représentation de caractères ASCII de celui-ci.

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.

Cheers, David

+0

Est-ce que le but ultime est de les imprimer sur la console? Sinon, cette méthode a beaucoup de frais inutiles, par rapport aux suggestions de Jason et Sam. – Kip

+0

@Kip: C'est une manière plus portable d'obtenir les octets pour plus que des entiers.La requête est plutôt étrange en premier lieu, cependant - pourquoi voudriez-vous essayer d'encoder un nombre entier en tant que caractères - à moins qu'il ne voulait vraiment dire des octets? –

+0

@Kip: Comme mentionné en premier lieu, c'était une réponse rapide et sale. Console.WriteLine était juste pour moi d'obtenir une sortie et la preuve que ça fonctionne. La partie intéressante est les méthodes utilisées pour atteindre l'objectif. – VVS

4

On ne sait pas si cela 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); 

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

0

contractent le 8 octets blocs:

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

Ne pas briser les trois premiers octets vers le bas dans un seul octet, il suffit de les diviser par le nombre approprié et effectuer une autre logique et pour obtenir votre dernier octet. Edit: La solution de Jason avec les bitshifts est bien plus agréable bien sûr.

5

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

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

BitConverter

0

.net utilise Unicode, char est de 2 octets non 1

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

Si vous ne voulez pas 4 octets et caractères remplacent puis le char est l'octet dans la réponse de Jason

+0

Juste pour clarifier: .net utilise Unicode codé comme UCS-2 (ergo les 2 octets). – tzot

4

Je l'ai essayé quelques moyens et cadencé le temps nécessaire pour convertir 1000000 ints.

méthode de conversion intégré, 325000 tiques:

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

conversion de pointeur, 100000 tiques:

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

opérateurs de bits, 77000 tiques:

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