求助:将双NUL分隔的byte[]转换为Unicode字符串的高效方法
解决方案
方法一:利用Unicode字符串分割(最简单高效)
因为你的分隔符是两个连续的0x00字节,对应Unicode编码中的空字符'\0',所以可以直接将整个字节数组转为Unicode字符串,再按'\0'分割并过滤空项:
byte[] myBuffer = ...; // 你的目标字节数组 string fullUnicodeStr = new UnicodeEncoding().GetString(myBuffer); string[] allStrings = fullUnicodeStr.Split(new[] { '\0' }, StringSplitOptions.RemoveEmptyEntries);
针对你提供的示例字节数组,转换后的字符串是"str1\0str2\0str3\0\0",分割后会得到["str1", "str2", "str3"],完全符合需求。
方法二:直接在字节数组中定位分隔符(适合精细控制场景)
如果不想转换整个字符串,可以遍历字节数组,定位连续两个0x00的分隔符位置,逐段截取转换:
List<string> ExtractUnicodeStrings(byte[] buffer) { var result = new List<string>(); int segmentStart = 0; int bufferLength = buffer.Length; for (int i = 0; i < bufferLength - 1; i++) { // 匹配分隔符:连续两个0x00字节 if (buffer[i] == 0 && buffer[i + 1] == 0) { // 跳过空段(避免开头或连续分隔符产生空字符串) if (i > segmentStart) { result.Add(new UnicodeEncoding().GetString(buffer, segmentStart, i - segmentStart)); } // 检查是否是结束标记(连续四个0x00) if (i + 3 < bufferLength && buffer[i + 2] == 0 && buffer[i + 3] == 0) { break; } // 移动到下一个字符串的起始位置 segmentStart = i + 2; i++; // 跳过已匹配的第二个0x00,避免重复检查 } } return result; }
补充说明
你之前使用UnicodeEncoding.Unicode.GetString(myBuffer)看到乱码,是因为大部分文本渲染工具遇到'\0'会截断显示,但实际字符串中包含了所有后续内容,因此直接分割是完全可行的。方法一无需手动处理字节定位,代码简洁且性能更优,优先推荐使用。
内容的提问来源于stack exchange,提问作者totalZero
相关产品推荐
相关产品推荐

