110,538
社区成员
发帖
与我相关
我的任务
分享
private IEnumerable<string> PtrToStringBSTR(IntPtr ptr)
{
while (Marshal.ReadInt16(ptr) != 0)
{
string str = Marshal.PtrToStringUni(ptr);
ptr += (str.Length + 1) * 2;
yield return str;
}
}
private static extern int _GetBufferedMBSTR([In] IntPtr @this, [In, MarshalAs(UnmanagedType.I4)] int index, [In, Out] IntPtr buffer, [In] int size, [Out] out int length);
public string[] GetBufferedString(int index)
{
IntPtr buffer = Marshal.AllocCoTaskMem(256 * 2);
int length = 0;
try
{
_GetBufferedMBSTR(_basecpp, index, buffer, 256, out length);
return PtrToStringBSTR(buffer).ToArray();
}
finally
{
Marshal.FreeCoTaskMem(buffer);
}
}
void Test()
{
string multiString = "hello" + (char)0 + "world" + (char)0 + (char)0;
byte[] bytes = Encoding.Default.GetBytes(multiString);
List<string> strs = GetMultiString(bytes);
}
static List<string> GetMultiString(byte[] bytes)
{
List<string> result = new List<string>();
for (int i = 0; i < bytes.Length; )
{
int j = Array.IndexOf<byte>(bytes, 0, i);
if (j == -1 || j - i < 2) break;
result.Add(Encoding.Default.GetString(bytes, i, j - i));
i = j + 1;
}
return result;
}