You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:将双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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 08:13:33