سؤال

أحتاج إلى التحقق من string تقع داخل الحزمة التي أتلقاها byte مجموعة مصفوفة. إذا كنت تستخدم BitConverter.ToString(), ، أحصل على بايت string مع شرطات (FE: 00-50-25-40-A5-FF).
حاولت معظم الوظائف التي وجدتها بعد googling سريعة، ولكن معظمها لديها نوع المعلمة الإدخال string وإذا اتصلت بهم string مع شرطات، فإنه يلقي استثناء.

أحتاج إلى وظيفة تتحول عرافة (كما string أو وكذلك byte) داخل ال string هذا يمثل القيمة السداسية عشرية (FE: 0x31 = 1). إذا كانت المعلمة الإدخال string, ، يجب أن تتعرف الوظيفة على شرطات (مثال "47-61-74-65-77-61-79-77-65-79-65-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();

يمكنك تقسيم السلسلة في -
تحويل النص إلى Ints (Int.tryparse)
إخراج int كسلسلة هيكس {0: x2}

لدعم يونيكود:

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 (BYTE [])

 string hexString = "8E2";
 int num = Int32.Parse(hexString, System.Globalization.NumberStyles.HexNumber);
 Console.WriteLine(num);
 //Output: 2274

من https://msdn.microsoft.com/en-us/library/bb311038.aspx.

إذا كنت بحاجة إلى نتيجة كصفيف بايت، يجب عليك نقلها مباشرة دون تغييرها إلى سلسلة، ثم قم بتغييره إلى البايت. في المثال الخاص بك (FE: 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