C#中如何使用GetString()方法将字节数组指定元素解码为字符串
字节数组分段转字符串的简化实现
你当前的实现存在冗余操作,可以按以下思路优化,大幅简化代码:
- 去掉不必要的全数组复制:
Encoding.GetString本身不会修改传入的原始字节数组,只要你不需要改动派生类中msg的内容,完全可以直接基于原数组解码,不需要额外声明mainClassArray做Array.Copy操作。 - 提取重复解码的固定片段:你需要的两个解码结果(前4字节、后4字节)是固定值,不需要重复调用6次
GetString,只需要解码1次存为变量复用即可。 - 用循环替代逐行硬编码赋值:你的目标数组是按「前4字节解码结果、后4字节解码结果」的顺序重复3次,用循环填充即可,不需要逐行写6条赋值语句。
优化后代码示例
// 派生类原始字节数组 byte[] msg = new byte[8] { 0x01, 0x08, 0x1A, 0x0B, 0xFF, 0x03, 0x31, 0x2C }; // 仅需解码2次,复用结果 string firstPart = ASCIIEncoding.ASCII.GetString(msg, 0, 4); string secondPart = ASCIIEncoding.ASCII.GetString(msg, 4, 4); // 循环填充目标数组 string[] ArrayToStr = new string[6]; for (int i = 0; i < 6; i += 2) { ArrayToStr[i] = firstPart; ArrayToStr[i + 1] = secondPart; }
额外注意事项
- 你给出的测试字节中包含
0xFF,该值不在标准ASCII的0-127取值范围内,用ASCII解码会被替换为?。如果你需要保留0-255全范围字节的对应字符,应该换用ISO-8859-1(Latin-1)编码,写法为Encoding.GetEncoding("ISO-8859-1"),可以无损失映射单字节值到Unicode字符。 - 如果追求更高性能、减少额外内存分配,可以用
Span<byte>做字节切片,不需要复制数组内存:
Span<byte> msgSpan = msg.AsSpan(); string firstPart = ASCIIEncoding.ASCII.GetString(msgSpan.Slice(0, 4)); string secondPart = ASCIIEncoding.ASCII.GetString(msgSpan.Slice(4, 4));
- 如果后续分段规则变化,只需要调整循环内的切片逻辑和预解码片段即可,维护成本远低于逐行硬编码的写法。
内容的提问来源于stack exchange,提问作者Lha
相关产品推荐
相关产品推荐

