我正在尝试使用整数作为字符串的数字表示,例如,将“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) });
有更清洁的方法吗?我已经尝试了各种演员表,但正如预期的那样,编译器抱怨它。
答案 0 :(得分:3)
字符是16位,因此您必须将它们编码为8位值以将它们打包为整数。您可以使用Encoding
类在字符和字节之间进行转换,并使用BitConverter
类在字节和整数之间进行转换
以下是双向转换:
string original = "ABCD";
int number = BitConverter.ToInt32(Encoding.ASCII.GetBytes(original), 0);
string decoded = Encoding.ASCII.GetString(BitConverter.GetBytes(number));
请注意,整数中字节的顺序取决于计算机的字节顺序。在小端系统上,“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);
或者如果您使用的是框架3.5:
int number =
BitConverter.ToInt32(Encoding.ASCII.GetBytes(original).Reverse().ToArray() , 0);
string decoded =
Encoding.ASCII.GetString(BitConverter.GetBytes(number).Reverse().ToArray());
答案 1 :(得分:3)
int value = 0x41424344;
string s = Encoding.ASCII.GetString(
BitConverter.GetBytes(value).Reverse().ToArray());
(上面假设你是在一个小端系统上运行。对于big-endian你可以放弃.Reverse().ToArray()
部分,虽然你是在一个小端系统然后它可能会更有意义的是,如果可能的话,首先将“ABCD”存储为0x44434241。)
答案 2 :(得分:0)
public string ConvertToHex(string asciiString)
{
string hex = "";
foreach (char c in asciiString)
{
int tmp = c;
hex += String.Format("{0:x2}", (uint)System.Convert.ToUInt32(tmp.ToString()));
}
return hex;
}
它会根据您的要求将字符串转换为十六进制。
答案 3 :(得分:0)
public static string ToHexString(string value)
{
return value.Aggregate(new StringBuilder("0x"),
(sb, c) => sb.AppendFormat("{0:x2}", (int)c)).ToString();
}
答案 4 :(得分:0)
如果字符串永远不超过8个字符和一种Hexstring,你可以使用 基本变量16查看Convert类的转换函数。
string s = "ABCD";
uint i = Convert.ToUInt32( s, 16 );
MessageBox.Show( Convert.ToString( i, 16 ) );
问候 糟糕