首页 > 解决方案 > 如何使用其指针将未知长度的 C++ 字符串编组为 C#?

问题描述

我正在尝试将结构中的动态分配的 char 数组编组为 C#。该结构有一个指向数组的指针。问题是 char 数组包含多个以空字符结尾的字符串,最后一个字符串以两个连续的空字符结尾。

如果我尝试编组它,LPStr我将只得到“列表”中的第一个字符串。

我尝试使用 UnmanagedMemoryStream 但它需要知道数组的长度。

有没有办法在不知道数组长度的情况下将字节作为流读取?(除了使用长度字节缓冲区并不断增加指针,直到找到两个连续的空终止字符)。

标签: c#c++pinvokemarshalling

解决方案


正如 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();
}

推荐阅读