Pergunta

O que é a melhor maneira de dividir um número inteiro de 32 bit em quatro caracteres (não assinados) em C #.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top