将字符串转换为字节数组替换特定字符之间的字符

时间:2018-03-29 23:54:33

标签: c# string linq

我试图找到一种转换字符串(输入到TextBox)并将其转换为字节数组以发送串口/套接字的方法。

我将转换字符串转换为byte []部分很好,但我对替换

有点困难

基本上,GUI允许用户指定要发送的响应的格式,我正在查看类似以下的内容: -

用户输入:[2]测试{1} {2} [3]

{1}和{2}是可变字段,可以从传入消息中提取,因此它们当前正在被替换而没有问题。

我想要实现的是将[2]替换为STX字符,将[3]替换为ETX字符,其中2和3是它们的ASCII等价物。 www.asciitable.com

用户可以输入此格式的任何有效ascii字符,因此[13]用于CR等

循环字符串的最佳方法是记住[然后索引]的索引并获取这两个索引之间的所有字符吗?还是有更有效的方式?

谢谢,

丹尼尔。

2 个答案:

答案 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[]