题
我需要检查位于我接收作为string
阵列的分组内的byte
。如果我使用BitConverter.ToString()
,我得到的字节用破折号(f.e:00-50-25-40-A5-FF)string
。结果
我试图我的快速谷歌搜索后发现的大多数功能,但其中大多数的具有输入参数类型string
和,如果我打电话给他们与破折号string
,它会引发异常。
我需要,轮流进制(如string
或作为byte
)的函数为表示十六进制值的string
(f.e:0X31 = 1)。如果输入参数是string
,功能应该承认破折号(例如“47-61-74-65-77-61-79-53-65-72-76-65-72”),因为BitConverter
不正确转换
解决方案
像这样?
static void Main()
{
byte[] data = FromHex("47-61-74-65-77-61-79-53-65-72-76-65-72");
string s = Encoding.ASCII.GetString(data); // GatewayServer
}
public static byte[] FromHex(string hex)
{
hex = hex.Replace("-", "");
byte[] raw = new byte[hex.Length / 2];
for (int i = 0; i < raw.Length; i++)
{
raw[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
}
return raw;
}
其他提示
string str = "47-61-74-65-77-61-79-53-65-72-76-65-72";
string[] parts = str.Split('-');
foreach (string val in parts)
{
int x;
if (int.TryParse(val, out x))
{
Console.Write(string.Format("{0:x2} ", x);
}
}
Console.WriteLine();
结果 - 您可以在拆分字符串 将文本转换到整型(int.TryParse)点击 输出的int用作一个十六进制字符串{0:X2}
有关支持Unicode:
public class HexadecimalEncoding
{
public static string ToHexString(string str)
{
var sb = new StringBuilder();
var bytes = Encoding.Unicode.GetBytes(str);
foreach (var t in bytes)
{
sb.Append(t.ToString("X2"));
}
return sb.ToString(); // returns: "48656C6C6F20776F726C64" for "Hello world"
}
public static string FromHexString(string hexString)
{
var bytes = new byte[hexString.Length / 2];
for (var i = 0; i < bytes.Length; i++)
{
bytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
}
return Encoding.Unicode.GetString(bytes); // returns: "Hello world" for "48656C6C6F20776F726C64"
}
}
您提到的“0X31 = 1”让我想你实际上是试图ASCII值转换为字符串 - 在这种情况下,你应该使用类似Encoding.ASCII.GetString(字节[])
string hexString = "8E2";
int num = Int32.Parse(hexString, System.Globalization.NumberStyles.HexNumber);
Console.WriteLine(num);
//Output: 2274
如果您需要的结果作为字节数组,你应该直接通过它没有它改变成一个字符串,然后改回为字节。
在您的示例(f.e:0x31 = 1
)是ASCII码。在这种情况下,以(十六进制值)的字符串转换为ASCII值,使用:
Encoding.ASCII.GetString(byte[])
byte[] data = new byte[] { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30 };
string ascii=Encoding.ASCII.GetString(data);
Console.WriteLine(ascii);
在控制台将显示:1234567890
不隶属于 StackOverflow