2008-09-23 12 views
5

¿Cuál es la mejor manera de dividir un entero de 32 bits en cuatro caracteres (sin signo) en C#.Conversión de entero de 32 bits a 4 caracteres

+0

Lo que se puede esperar de los caracteres ¿ser? ¿Interpretación ASCII de los bytes? –

+0

¿Te refieres a caracteres o bytes? Los caracteres son caracteres individuales de texto en una codificación dada, que pueden corresponder a múltiples bytes, probablemente no lo que usted desea. –

Respuesta

7

Quick'n'dirty:

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

Convertir el int a bytes, la inversión de la matriz de bytes para el orden correcto y luego conseguir la representación de caracteres ASCII de ella.

EDIT: el método Reverse es un método de extensión de .NET 3.5, solo para información. Invertir el orden de bytes también puede no ser necesario en su escenario.

Cheers, David

+0

¿El objetivo final es simplemente imprimirlos en la consola? Si no, este método tiene una sobrecarga innecesaria, en comparación con las sugerencias de Jason y Sam. – Kip

+0

@Kip: Sin embargo, esta es una forma más portátil de obtener bytes para más que enteros.Sin embargo, la solicitud es bastante extraña en primer lugar, ¿por qué querrías intentar codificar un número entero como caracteres, a menos que realmente quisiera decir bytes? –

+0

@Kip: Como se mencionó en primer lugar, esta fue una respuesta rápida y sucia. Console.WriteLine fue solo para mí para obtener algún resultado y prueba de que está funcionando. La parte interesante es los métodos utilizados para lograr el objetivo. – VVS

4

No está claro si esto es realmente lo que quiere, pero:

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

Esto supone que desea los bytes interpretados como el rango más bajo de caracteres Unicode.

0

consigue el 8-byte-bloques:

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

se rompen los tres primeros bytes hacia abajo en un solo byte, sólo les dividir por el número adecuado y realizar otra lógica y para obtener su último byte.

Editar: La solución de Jason con los cambios de bits es mucho más agradable, por supuesto.

5

Char? ¿Tal vez estás buscando esta práctica función de ayuda pequeña?

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

BitConverter

0

.NET utiliza Unicode, un char es de 2 bytes no 1

Para convertir entre los datos binarios que contienen texto no Unicode utilizar la clase System.Text.Encoding .

Si usted quiere 4 bytes y caracteres no sustituirán al carbón con el byte en la respuesta de Jason

+0

Solo para aclarar: .net usa Unicode codificado como UCS-2 (ergo los 2 bytes). – tzot

4

He probado algunas de las formas y cronometrado el tiempo necesario para convertir 1000000 enteros.

método de conversión incorporada, 325000 garrapatas:

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

conversión del puntero, 100000 garrapatas:

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

Bitshifting, 77000 garrapatas:

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