C# 字符串操作和拆分
我有一个数据字符串data2=“%04%02%BC%94%BA%15%E3%AA%08%00%7F%00”我正在尝试将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
%
符号之间的每两个数字分割,并将其放入数组中
除此之外,如果有额外的数字,即超过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
。你是怎么得到的<