C#读取远程CNC程序字节缓冲区并按行拆分至字符串数组的方法
解决CNC程序字节缓冲区拆分多行并在Blazor展示的问题
问题原因
从你提供的字节序列能看到,CNC程序的换行符是Windows标准的\r\n(十六进制0D-0A),但你的代码仅将缓冲区转为单个字符串,且Blazor中直接输出字符串时,HTML会把换行符解析为空格,导致所有内容显示为一行。另外字节序列末尾有两组0D-0A,会产生空行,需要过滤。
代码修改方案
1. 修改读取方法,直接返回字符串数组
调整原方法的输出类型,在读取完成后直接拆分出每一行:
public Int32 doNCK_CopyFromNCAlloc(Int32 connnr, Int32 timeout, string path, out string[] CNC_File_Lines) { Int32 result = 0; Byte[] buff = null; Int32 bufflen = 0; String filename = path; CNC_File_Lines = Array.Empty<string>(); // 初始化默认空数组 result = AGL4.NCK_CopyFromNCAlloc(connnr, filename, out buff, out bufflen, timeout); if (result == 0) { // 转换为UTF8字符串并清理空字符 string rawContent = System.Text.Encoding.UTF8.GetString(buff).Replace("\0", string.Empty); // 按Windows换行符拆分,自动移除空行 CNC_File_Lines = rawContent.Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); } Return_Read_CNC_File = result; return result; }
2. 保留原方法输出,在Blazor中拆分
如果不想修改原方法的输出类型,可在Blazor组件内对获取到的字符串进行拆分:
// Blazor组件代码块 private string[] cncProgramLines = Array.Empty<string>(); protected override void OnInitialized() { string cncContent = ""; int result = yourService.doNCK_CopyFromNCAlloc(connnr, timeout, path, out cncContent); if (result == 0) { cncProgramLines = cncContent.Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); } }
Blazor页面逐行展示
在Razor页面中用循环渲染每一行内容:
@if (cncProgramLines.Any()) { <div class="cnc-program-container"> @foreach (var line in cncProgramLines) { <div class="cnc-line">@line</div> } </div> } else { <p>未读取到CNC程序内容</p> }
如果需要保留程序原格式(比如缩进),也可以直接用<pre>标签渲染完整字符串:
@if (!string.IsNullOrEmpty(CNC_File_Out)) { <pre class="cnc-pre">@CNC_File_Out</pre> }
内容的提问来源于stack exchange,提问作者Mdarende
相关产品推荐
相关产品推荐

