Pregunta

¿Cuál es la mejor manera de dividir un entero de 32 bits en cuatro caracteres (sin firmar) en C#?

¿Fue útil?

Solución

Rápido y sucio:

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

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

EDITAR:El método inverso es un método de extensión de .NET 3.5, solo para información.Es posible que tampoco sea necesario invertir el orden de los bytes en su escenario.

Saludos, david

Otros consejos

¿Carbonizarse?¿Quizás estás buscando esta pequeña y práctica función auxiliar?

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

No está claro si esto es realmente lo que quieres, 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 que los bytes se interpreten como el rango más bajo de caracteres Unicode.

Lo probé de varias maneras y registré el tiempo necesario para convertir 1000000 ints.

Método de conversión incorporado, 325000 ticks:

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

Conversión de puntero, 100000 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;
}

Cambio de bits, 77000 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;
}

Obtenga los bloques de 8 bytes:

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

Divida los primeros tres bytes en un solo byte, simplemente divídalos por el número adecuado y realice otro lógico y para obtener el byte final.

Editar:La solución de Jason con los cambios de bits es mucho mejor, por supuesto.

Convertidor de bits

.net usa Unicode, un carácter tiene 2 bytes, no 1

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

Si desea 4 bytes y no caracteres, reemplace el carácter con byte en la respuesta de Jason.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top