A conversão de 32 bits número inteiro de 4 caracteres
Pergunta
O que é a melhor maneira de dividir um número inteiro de 32 bit em quatro caracteres (não assinados) em C #.
Solução
Quick'n'dirty:
int value = 0x48454C4F;
Console.WriteLine(Encoding.ASCII.GetString(
BitConverter.GetBytes(value).Reverse().ToArray()
));
A conversão do int para bytes, invertendo o byte-array para a ordem correta e, em seguida, ficando a representação de caracteres ASCII a partir dele.
EDIT: o método reversa é um método de extensão do .NET 3.5, apenas para informações. Invertendo a ordem de bytes também pode não ser necessário em seu cenário.
Cheers, David
Outras dicas
Char? Talvez você está olhando para esta função pouco útil ajudante?
Byte[] b = BitConverter.GetBytes(i);
Char c = (Char)b[0];
[...]
Não está claro se este é realmente o que você quer, mas:
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);
Isso pressupõe que você quer os bytes interpretada como o menor intervalo de caracteres Unicode.
Eu tentei algumas maneiras e cronometrou o tempo necessário para converter 1000000 ints.
Built-in método de conversão, 325000 carrapatos:
Encoding.ASCII.GetChars(BitConverter.GetBytes(x));
conversão Pointer, 100000 carrapatos:
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 carrapatos:
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;
}
Do obter os 8 bytes-blocos:
int a = i & 255; // bin 11111111
int b = i & 65280; // bin 1111111100000000
Do quebrar os três primeiros bytes para baixo em um único byte, apenas dividi-los pelo número adequado e executar outra lógica e para obter o seu byte final.
Edit:. Solução de Jason com as bitshifts é muito mais agradável do curso
BitConverter
.NET utiliza Unicode, um char é 2 bytes não 1
Para converter entre dados binários contendo o uso de texto não-unicode a classe System.Text.Encoding.
Se você quer 4 bytes e não caracteres em seguida, substituir o caractere com byte em resposta de Jason