这个业务逻辑表面上看起来是一个数据解析和结构化(打包成“簇”,即 C# 中的结构体或类)的过程。不过,在写代码之前,我们需要先修正一个隐藏的小错误。
🔍 关键点修正:关于“34-2”的截取
在字符串截取中,“34-2”通常指从索引 34 开始截取 2 个字符。但根据前面的逻辑规律,这里大概率是一个连续按位置截取的协议:
0-2(前2个字符)2-32(接下来的30个字符)- 如果接下来的截取是从索引 32 开始,长度为 2,那么范围应该是
32-2(即第 32、33 位)。如果是从 34 开始,中间就会漏掉 2 个字符。
为了保证代码的健壮性,我在下面提供的代码中,会严格按照你给出的“索引 34,长度 2”来编写,但同时做好了越界保护。如果你的协议实际上是连续的,你只需要把代码里的34改成32即可。
🛠️ C# 完整实现代码
在 C# 中,通常使用struct(结构体)或class(类)来对应 LabVIEW 中的“簇(Cluster)”。以下是完整的控制台应用程序代码:
usingSystem;usingSystem.Globalization;namespaceStringParserApp{// 定义“簇”(Cluster)对应的结构体,用于捆绑数据publicstructDataCluster{publicintFirstValue;// 对应截取 0-2 转换的数值 (例如 13911)publicdoubleSecondValue;// 对应截取 2-32 转换的双精度浮点数 / 10publicintThirdValue;// 对应截取 34-2 转换的数值}classProgram{staticvoidMain(string[]args){// 模拟一条符合你描述的原始字符串(总长度至少需要 36 位,避免截取越界)// 0-2位: "13" -> 转数值(根据你的描述,这里可能是某种特定编码或进制,或者是举例。我们先按标准的常规转换处理)// 2-32位: "911..."stringinputString="1391100000000000000000000000000012345";Console.WriteLine($"原始字符串:{inputString}");Console.WriteLine($"字符串总长度:{inputString.Length}");Console.WriteLine("--------------------------------------------------");try{// 解析数据并捆绑到簇DataClustermyCluster=ParseStringToCluster(inputString);// 输出解析结果Console.WriteLine("解析成功!“簇”内部数据如下:");Console.WriteLine($"1. 字段一 (0-2) :{myCluster.FirstValue}");Console.WriteLine($"2. 字段二 (2-32) :{myCluster.SecondValue}");Console.WriteLine($"3. 字段三 (34-2) :{myCluster.ThirdValue}");}catch(Exceptionex){Console.WriteLine($"解析过程中发生错误:{ex.Message}");}Console.ReadLine();}/// <summary>/// 解析字符串并捆绑到簇的核心方法/// </summary>publicstaticDataClusterParseStringToCluster(stringsrc){// 安全检查:确保字符串长度足够,防止 Substring 抛出越界异常if(string.IsNullOrEmpty(src)||src.Length<36){thrownewArgumentException("输入字符串长度不足,无法解析。");}DataClustercluster=newDataCluster();// 1. 字符串截取 0-2 (从索引0开始,截取2个字符)// 💡 提示:如果 "13" 要变成 13911,这可能涉及特定的业务算法,这里演示标准转换stringpart1=src.Substring(0,2);if(int.TryParse(part1,outintval1)){cluster.FirstValue=val1;// 如果你的逻辑是固定让它等于 13911,取消下一行的注释:// cluster.FirstValue = 13911;}// 2. 字符串截取 2-32 (从索引2开始,截取30个字符)// 转成双精度浮点数 / 10stringpart2=src.Substring(2,30);if(double.TryParse(part2,NumberStyles.Any,CultureInfo.InvariantCulture,outdoubleval2)){cluster.SecondValue=val2/10.0;}else{cluster.SecondValue=0.0;// 转换失败的默认值}// 3. 字符串截取 34-2 (从索引34开始,截取2个字符)// 转成数值型stringpart3=src.Substring(34,2);if(int.TryParse(part3,outintval3)){cluster.ThirdValue=val3;}// 返回捆绑好数据的“簇”returncluster;}}}💡 代码要点解析(针对 LabVIEW 转 C# 的同学)
Substring(start, length): C# 的截取函数第二个参数是长度(Length),而不是结束符号的索引。所以Substring(2, 30)代表从第 2 位开始,往后数 30 个字符(即占满了第 2 到第 31 位)。double.TryParse: 在处理长浮点数字符串时,使用TryParse可以防止因为字符串中包含非数字字符而导致程序直接崩溃。添加CultureInfo.InvariantCulture可以避免因为电脑系统语言不同(例如某些欧洲国家用逗号,代替小数点.)导致的解析错误。- 关于 13911: 如果你的前两个字符
13必须直接映射到13911,请检查框图中是否有一个Map(映射)或者Switch(条件分支)控件。如果没有,直接给cluster.FirstValue = 13911;赋值即可。