Преобразование 32-битного целого числа в 4 символа

StackOverflow https://stackoverflow.com/questions/121059

  •  02-07-2019
  •  | 
  •  

Вопрос

Как лучше всего разделить 32-битное целое число на четыре (беззнаковых) символа в C#.

Это было полезно?

Решение

Быстро и грязно:

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

Преобразование int в байты, изменение байтового массива на противоположный для правильного порядка и последующее получение из него представления символов ASCII.

РЕДАКТИРОВАТЬ:Метод Reverse — это метод расширения .NET 3.5, просто для информации.Изменение порядка байтов в вашем сценарии также может не потребоваться.

Приветствую, Дэвид

Другие советы

Чар?Может быть, вы ищете эту удобную вспомогательную функцию?

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

Непонятно, действительно ли это то, что вы хотите, но:

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

Предполагается, что вы хотите, чтобы байты интерпретировались как наименьший диапазон символов Юникода.

Я попробовал это несколькими способами и зафиксировал время, необходимое для преобразования 1000000 целых чисел.

Встроенный метод конвертации, 325000 тиков:

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

Преобразование указателя, 100000 тиков:

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

Битовый сдвиг, 77000 тактов:

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

Получите 8-байтовые блоки:

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

Разбейте первые три байта на один байт, просто разделите их на нужное число и выполните еще одну логическую операцию, чтобы получить последний байт.

Редактировать:Решение Джейсона с битовыми сдвигами, конечно, намного приятнее.

Битконвертер

.net использует Unicode, символ имеет размер 2 байта, а не 1

Для преобразования двоичных данных, содержащих текст, отличный от Юникода, используйте класс System.Text.Encoding.

Если вам нужны 4 байта, а не символы, замените символ байтом в ответе Джейсона.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top