5

在 C# 中将 32 位整数分成四个(无符号)字符的最佳方法是什么。

4

6 回答 6

7

Quick'n'dirty:

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

将 int 转换为字节,将字节数组反转为正确的顺序,然后从中获取 ASCII 字符表示。

编辑:该Reverse方法是 .NET 3.5 的扩展方法,仅供参考。在您的场景中也可能不需要反转字节顺序。

于 2008-09-23T13:48:53.190 回答
5

字符?也许您正在寻找这个方便的小助手功能?

Byte[] b = BitConverter.GetBytes(i);
Char c = (Char)b[0];
[...]
于 2008-09-23T13:48:42.223 回答
4

目前尚不清楚这是否真的是您想要的,但是:

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

这假设您希望将字节解释为最低范围的 Unicode 字符。

于 2008-09-23T13:43:49.223 回答
4

我已经尝试了几种方法,并计算了转换 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;
}
于 2008-09-23T14:28:09.243 回答
0

获取 8 字节块:

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

将前三个字节分解为一个字节,只需将它们除以适当的数字并执行另一个逻辑并获得最终字节。

编辑:Jason 的移位解决方案当然要好得多。

于 2008-09-23T13:44:32.280 回答
0

.net 使用 Unicode,一个 char 是 2 个字节而不是 1

要在包含非 unicode 文本的二进制数据之间进行转换,请使用 System.Text.Encoding 类。

如果你确实想要 4 个字节而不是字符,那么在 Jason 的回答中用字节替换字符

于 2008-09-23T13:51:41.047 回答