C# 字符串操作和拆分

C# 字符串操作和拆分,c#,string,c#-4.0,ascii,C#,String,C# 4.0,Ascii,我有一个数据字符串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> Valu

我有一个数据字符串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);
        }
string data=“%04F%02%BC%94%BA%15%E3%AA%08%00%7FF%00”;
列表值=新列表();
字符串[]val=Regex.Split(数据2,“%”);
字节[]临时字节=新字节[val.Length-1];
对于(int i=0;i2)
{
//计数
整数计数=0;
int n=2;//从数字2开始(如果有)
foreach(值[i]中的字符)
{
计数++;
}
int index=count-2;//索引从2开始
而
(int)c.ToString(“X”).ToArray();
值。添加(临时);
n=n+1;
}
//删除多余的数字
值[i]=值[i]。替换(值[i]。子字符串(2,1),string.Empty);
}
}
值。RemoveAt(0)//因为数字0总是零
字符串[]TagTemp=Values.ToArray();
//转换为数组
对于(int i=0;i
将额外数字添加到第一个位置时,即
04F
,输出正确:

当它被添加到倒数第二个位置时,即
7FF
而不是
7f46
它只给出
7


你们看到哪里出了问题,怎么解决了吗?

你们不能把一个三位数的十六进制字符串转换成一个字节。一个字节可以容纳的最大值是FF。

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

值[i]。替换(值[i]。子字符串(2,1),字符串.Empty)正在替换两个F,而不仅仅是一个

有关位置替换的示例,请参见。

值[i]。替换(值[i]。子字符串(2,1),字符串.Empty)正在替换两个F,而不仅仅是一个

     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()));

有关位置替换的示例,请参见。

string data=“%04F%02%BC%94%BA%15%E3%AA%08%00%7FF%00”;
     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()));
//你需要选择一种编码——这些东西是ASCII码吗? var encoding=encoding.ASCII; var值=新列表(); //浏览数据(请注意,我们这里不增加)。 对于(int i=0;istring.Format(“{0:X2}”,v)); //或者。。。 WriteLine(BitConverter.ToString(values.ToArray());
字符串数据=“%04F%02%BC%94%BA%15%E3%AA%08%00%7FF%00”;
//你需要选择一种编码——这些东西是ASCII码吗?
var encoding=encoding.ASCII;
var值=新列表();
//浏览数据(请注意,我们这里不增加)。
对于(int i=0;istring.Format(“{0:X2}”,v));
//或者。。。
WriteLine(BitConverter.ToString(values.ToArray());

输出如何正确?如何从
0x04
0x4F
获取
46
,具体取决于您希望如何处理额外的十六进制数字?@RogerLipscombe-
04F
被翻译为
04 46
F
被转换为十六进制,这怎么“正确”呢<代码>0x04F
79
<代码>0x04为
4
0x4F
仍然是
79
。你是怎么得到的<