c# - 如何使用其指针将未知长度的 C++ 字符串编组为 C#?
问题描述
我正在尝试将结构中的动态分配的 char 数组编组为 C#。该结构有一个指向数组的指针。问题是 char 数组包含多个以空字符结尾的字符串,最后一个字符串以两个连续的空字符结尾。
如果我尝试编组它,LPStr
我将只得到“列表”中的第一个字符串。
我尝试使用 UnmanagedMemoryStream 但它需要知道数组的长度。
有没有办法在不知道数组长度的情况下将字节作为流读取?(除了使用长度字节缓冲区并不断增加指针,直到找到两个连续的空终止字符)。
解决方案
正如 Hans Passant 所建议的,唯一的方法是Marshal.ReadByte()
,所以最后你必须多次读取内存(PtrToStringAnsi
至少读取两次加上我们为找到下一个字符串开始位置所做的一次)。
public static string[] IntPtrToStringArrayAnsi(IntPtr ptr)
{
var lst = new List<string>();
do
{
lst.Add(Marshal.PtrToStringAnsi(ptr));
while (Marshal.ReadByte(ptr) != 0)
{
ptr = IntPtr.Add(ptr, 1);
}
ptr = IntPtr.Add(ptr, 1);
}
while (Marshal.ReadByte(ptr) != 0);
// See comment of @zneak
if (lst.Count == 1 && lst[0] == string.Empty)
{
return new string[0];
}
return lst.ToArray();
}
推荐阅读
- java - 获取正在运行 Web 应用程序的服务器的端口号
- firebase - 如何从我的流中获取数据并使用它?
- javascript - Simple Web Sticky Note,模态弹出编辑菜单不会读取现有文本字段
- ionic2 - 如何删除悬停箭头
- java - 调整大小时 JScrollPane 动态 RowHeader 不同步
- android - 另一个视图顶部的过渡动画
- gitlab - 桥和作业 Gitlab API 端点找不到子管道及其作业
- reactjs - React JS 中的 AWS Amplify 身份验证屏幕自定义
- sql - 将 SQL Server / C# 查询转换为 PostgreSQL
- nginx - 为什么我的 nginx 测试页面 ipaddress 在向我的 ip 地址添加两个静态页面后显示 403 禁止?