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

如何在C#中从首个字节引用重建字符串(单元测试场景)

可以用C# unsafe代码实现从首个字节引用重建字符串吗?

完全可以。因为C/C++库接收的文件路径是以\0(空字节)结尾的字节序列,利用C#的unsafe代码,我们可以通过首个字节的引用获取指针,遍历到终止符后重建完整字符串。

具体实现代码

结合你的单元测试Mock方法,修改后的实现如下:

unsafe private int DoJobMock(IntPtr handle, ref byte filePath)
{
    // 将byte引用转换为字节指针
    byte* bytePtr = &filePath;

    // 遍历到空字节,计算字符串有效长度
    int strLength = 0;
    while (bytePtr[strLength] != 0)
    {
        strLength++;
    }

    // 从指针重建字符串(编码需与原调用一致,这里假设为UTF-8)
    string reconstructedPath = new string((sbyte*)bytePtr, 0, strLength, System.Text.Encoding.UTF8);

    // 这里可添加测试逻辑,比如验证路径是否符合预期
    // Assert.AreEqual("file.txt", reconstructedPath);

    // 返回模拟的函数结果码
    return 0;
}

关键注意事项

  • 启用unsafe代码:需要在项目属性中勾选「允许不安全代码」(Allow unsafe code),否则无法编译。
  • 编码一致性:重建字符串时使用的编码必须和原调用中转换字节数组的编码一致(比如原调用用UTF-8,Mock里也要用UTF-8;如果是ANSI编码则用Encoding.Default)。
  • 补全终止符:原调用中,你需要确保传递给DoJob的字节数组末尾包含\0空字节(C/C++字符串的终止标记),否则Mock方法会读取到内存中的无效数据。修正后的原调用示例:
    string jobFilePath = "file.txt";
    var filePathBytes = System.Text.Encoding.UTF8.GetBytes(jobFilePath);
    // 追加空字节作为终止符
    var filePathWithNull = new byte[filePathBytes.Length + 1];
    Array.Copy(filePathBytes, filePathWithNull, filePathBytes.Length);
    filePathWithNull[filePathBytes.Length] = 0;
    var resCode = _api.DoJob(_handle, ref filePathWithNull[0]);
    

内容的提问来源于stack exchange,提问作者theateist

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 01:57:33