在 C# 中使用 int 作为字符串的数字表示

rbu*_*uch 3 c# string int

我尝试使用整数作为字符串的数字表示形式,例如,将“ABCD”存储为 0x41424344。然而,当涉及到输出时,我必须将整数转换回 4 个 ASCII 字符。现在,我正在使用位移位和掩码,如下所示:

int value = 0x41424344;
string s = new string (
              new char [] { 
                 (char)(value >> 24), 
                 (char)(value >> 16 & 0xFF),
                 (char)(value >> 8 & 0xFF),
                 (char)(value & 0xFF) });
Run Code Online (Sandbox Code Playgroud)

有没有更干净的方法来做到这一点?我尝试了各种转换,但编译器正如预期的那样抱怨了它。

Guf*_*ffa 5

字符是 16 位的,因此您必须将它们编码为 8 位值才能将它们打包为整数。您可以使用该类Encoding在字符和字节之间进行转换,以及BitConverter使用该类在字节和整数之间进行转换

这是两种方式的转换:

string original = "ABCD";

int number = BitConverter.ToInt32(Encoding.ASCII.GetBytes(original), 0);

string decoded = Encoding.ASCII.GetString(BitConverter.GetBytes(number));
Run Code Online (Sandbox Code Playgroud)

请注意,整数中字节的顺序取决于计算机的字节顺序。在小端系统上,“ABCD”的数值将为 0x44434241。要获得相反的顺序,您可以反转字节数组:

byte[] data = Encoding.ASCII.GetBytes(original);
Array.Reverse(data);
int number = BitConverter.ToInt32(data, 0);

byte[] data2 = BitConverter.GetBytes(number);
Array.Reverse(data2);
string decoded = Encoding.ASCII.GetString(data2);
Run Code Online (Sandbox Code Playgroud)

或者如果您使用的是框架 3.5:

int number =
  BitConverter.ToInt32(Encoding.ASCII.GetBytes(original).Reverse().ToArray() , 0);

string decoded =
  Encoding.ASCII.GetString(BitConverter.GetBytes(number).Reverse().ToArray());
Run Code Online (Sandbox Code Playgroud)