我需要检查位于我接收作为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

https://msdn.microsoft.com/en-us/库/ bb311038.aspx

如果您需要的结果作为字节数组,你应该直接通过它没有它改变成一个字符串,然后改回为字节。 在您的示例(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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top