C#中如何合并两个for循环为单个循环实现8字节数组拆分赋值
8字节固定长度消息分段的简化实现
你当前手写两个for循环逐字节拷贝的写法完全可以简化,不需要手动做逐位下标赋值,用运行时内置的数组操作方法即可,代码更简洁,还能避免手动计算偏移量导致的下标越界问题。
通用兼容版实现(所有.NET版本可用)
直接用框架自带的Array.Copy方法替换两个手写for循环即可,逻辑和你原来的实现完全一致,代码量更少:
const int halfLength = 4; case 0: // 拷贝前4字节到Array1 Array.Copy(msg, 0, Array1, 0, halfLength); // 拷贝后4字节到Array2 Array.Copy(msg, halfLength, Array2, 0, halfLength); MainArray[0] = Encoding.ASCII.GetString(Array1); MainArray[1] = Encoding.ASCII.GetString(Array2);
更高性能的实现(.NET Core 2.1+/NET 5+可用)
如果你的运行时版本支持Span,可以直接省掉Array1、Array2两个临时数组,不需要做额外的数组内存分配,直接对原消息数组做切片转码即可:
const int segmentLength = 4; case 0: MainArray[0] = Encoding.ASCII.GetString(msg.AsSpan(0, segmentLength)); MainArray[1] = Encoding.ASCII.GetString(msg.AsSpan(segmentLength, segmentLength));
实现说明
- 固定长度的数组块拷贝优先用内置方法,这类方法都是经过框架层面深度优化的,执行效率比手写的逐位循环更高
- 固定为4字节的分段长度可以直接定义为常量,不需要在运行时重复计算
- 不需要手动维护循环下标,从根源上避免下标偏移算错、数组越界的低级问题
注意:如果你的MCU返回的消息长度不是固定8字节,记得在做切片/拷贝前先校验msg数组长度,避免出现越界异常。
内容的提问来源于stack exchange,提问作者Lha
相关产品推荐
相关产品推荐

