0

string data2 = " %04%02%BC%94%BA%15%E3%AA%08%00%7F%00";記号の間で2桁ごとに分割%して配列に入れようとしているデータがあります。

それに加えて、余分な桁がある場合、つまり2桁を超える場合は、16進数に変換して、配列に追加します。

コードが機能することもありますが、最後から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、出力は正しいです。

ここに画像の説明を入力してください

最後から2番目の位置が追加されると、つまり、7FF代わりに。7F 46だけが表示され7ます。

ここに画像の説明を入力してください

何が悪いのか、そしてそれを修正する方法がわかりますか?

4

3 に答える 3

2

3 桁の 16 進数文字列をバイトに変換することはできません。1 バイトが保持できる最大値は 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);1つだけではなく両方のFを置き換えています

文字列.置換()

位置置換の例については、この投稿を参照してください。

于 2013-03-18T09:49:53.553 に答える