如何在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
相关产品推荐
相关产品推荐

