我试图找到一种转换字符串(输入到TextBox)并将其转换为字节数组以发送串口/套接字的方法。
我将转换字符串转换为byte []部分很好,但我对替换
有点困难基本上,GUI允许用户指定要发送的响应的格式,我正在查看类似以下的内容: -
用户输入:[2]测试{1} {2} [3]
{1}和{2}是可变字段,可以从传入消息中提取,因此它们当前正在被替换而没有问题。
我想要实现的是将[2]替换为STX字符,将[3]替换为ETX字符,其中2和3是它们的ASCII等价物。 www.asciitable.com
用户可以输入此格式的任何有效ascii字符,因此[13]用于CR等
循环字符串的最佳方法是记住[然后索引]的索引并获取这两个索引之间的所有字符吗?还是有更有效的方式?
谢谢,
丹尼尔。
答案 0 :(得分:1)
正则表达式可以在括号之间找到数字,并用计算值替换它们。 你的替换方案看起来可能类似于String.Format,但是你必须比较它并决定操作的顺序和特殊字符的含义。
如果括号内的数字超出0-127,编码将抛出异常。如果你愿意,你可以有其他一些行为。
var encoding = Encoding.GetEncoding(Encoding.ASCII.CodePage,
EncoderFallback.ExceptionFallback,
DecoderFallback.ExceptionFallback);
var bracketRegex = new Regex(@"\[(?<digits>\d+)\]", RegexOptions.Compiled);
MatchEvaluator convertToCodepoint = (match) =>
Char.ConvertFromUtf32(Int32.Parse(match.Groups["digits"].Value));
var values = new[] {"a", "b", "c" };
var input = "[2] Test {1} {2} [3]";
encoding.GetBytes(String.Format(bracketRegex.Replace(input, convertToCodepoint), values))
.Dump();
答案 1 :(得分:0)
我认为你应该写一个类似的代码:
string input = TextBox.text; "User name (sales)";
//Use those lines if you don't know how many times do you have to iterate.
var totalOfBraces = input.Where(x => x == '{').Count();
var totalOfBrackets = input.Where(x => x == '[').Count();
var totalOfElements = totalOfBraces + totalOfBrackets;
string output = input.Split('[', ']')[1];
string output = input.Split('{', '}')[1];
你可以在Braces和Brackets之间获得元素并替换它们。
然后,为什么我添加了totalOfElements
,才有可能做for bucle
例如:
var counterOfBraces = 0;
var counterOfBrackets = 0;
for(var i=0; i<totalOfElements.Count(); i++){
if(i < totalOfBrackets){
counterOfBrackets+=1;
var textToFind = "[" + index + "]";
input = input.Replace(textToFind, "some new text");
} else {
//Do the same for braces
}
}
//NOW HERE, YOU HAVE YOUR TEXT FORMATED AND READY TO CONVERT IT TO BYTE[]