0

我有一个数据string data2 = " %04%02%BC%94%BA%15%E3%AA%08%00%7F%00";,我试图将%符号之间的每两位数字分开并将其放入一个数组中。

除此之外,如果有多余的数字,即多于 2 位,则转换为十六进制并将其添加到数组中。

我的代码有时可以工作,但是当我在倒数第二个位置添加额外的数字时,它会给出错误的值。

 string data = " %04F%02%BC%94%BA%15%E3%AA%08%00%7FF%00";

        List<string> Values = new List<string>();

        string[] val = Regex.Split(data2, "%");
        byte[] TempByte = new byte[val.Length - 1];


        for (int i = 0; i < val.Length; i++)
        {
            Values.Add(val[i]);

            if (Values[i].Length > 2)
            {
                //count
                int count = 0;
                int n = 2;                       //start from digit 2(if ther is any)
                foreach (char s in Values[i])
                {
                    count++;
                }
                int index = count - 2;         //index starting at 2

                while (n <= Values[i].Length -1)    
                {
                    string temp = string.Join(string.Empty, Values[i].Substring(n, 1).Select(c =>
                                                        ((int)c).ToString("X")).ToArray());


                    Values.Add(temp);
                    n = n + 1;
                }
                //remove the extra digit
                Values[i] = Values[i].Replace(Values[i].Substring(2, 1), string.Empty);

            }
        }


        Values.RemoveAt(0);                        //since digit 0 is always zero
        string[] TagTemp = Values.ToArray();

//Convert to array

        for (int i = 0; i < val.Length - 1; i++)
        {
            TempByte[i] = Convert.ToByte(TagTemp[i], 16);
        }

当额外的数字被添加到第一个位置时,即04F,输出是正确的:

在此处输入图像描述

当它被添加到倒数第二个位置时,即7FF代替7F 46它只给出7.

在此处输入图像描述

你们看到什么是错的以及如何解决它?

4

3 回答 3

2

您不能将三位十六进制字符串转换为字节。一个字节可以容纳的最大值是 FF。

于 2013-03-18T09:45:24.947 回答
2
     string data = " %04F%02%BC%94%BA%15%E3%AA%08%00%7FF%00";

     // You need to pick an encoding -- are these things ASCII?
     var encoding = Encoding.ASCII;
     var values = new List<byte>();

     // Walk over the data (note that we don't increment here).
     for (int i = 0; i < data.Length;)
     {
        // Is this the start of an escaped byte?
        if (data[i] == '%')
        {
           // Grab the two characters after the '%'.
           var escaped = data.Substring(i + 1, 2);
           //Console.WriteLine(escaped);

           // Convert them to a byte.
           byte value = Convert.ToByte(escaped, 16);
           values.Add(value);

           // Increment over the three characters making up the escaped byte.
           i += 3;
        }
        else
        {
           // It's a non-escaped character.
           var plain = data[i];
           //Console.WriteLine(plain);

           // Convert it to a single byte.
           byte[] bytes = encoding.GetBytes(new[] { plain });
           Debug.Assert(bytes.Length == 1);
           byte value = bytes[0];

           values.Add(value);

           // Increment over that character.
           i += 1;
        }
     }

     // Print it out, in hex, separated by commas.
     Console.WriteLine(string.Join(", ",
                       values.Select(v => string.Format("{0:X2}", v))));

     // Alternatively...
     Console.WriteLine(BitConverter.ToString(values.ToArray()));
于 2013-03-18T11:42:05.217 回答
1

Values[i].Replace(Values[i].Substring(2, 1), string.Empty);正在替换两个 F 而不仅仅是一个

字符串.替换()

有关位置替换的示例,请参见这篇文章。

于 2013-03-18T09:49:53.553 回答