如何将多字符串转换为C#字符串集合?

多字符串(双重空格终止的空字符串字符串)在Windows API中很常见。 将从API返回的多字符串转换为C#字符串集合的好方法是什么,反之亦然?

我对正确处理字符编码特别感兴趣(稍后是Windows XP)。

以下方法似乎可以创建多字符串,但我没有解码多字符串的示例。

static string StringArrayToMultiString( ICollection stringArray ) { StringBuilder multiString = new StringBuilder(); if (stringArray != null) { foreach (string s in stringArray) { multiString.Append(s); multiString.Append('\0'); } } return multiString.ToString(); } 

这可能是天真的,但如何:

 static string[] MultiStringToArray(string multiString) { return multiString.TrimEnd('\0').Split('\0'); } 

另外 – 你是不是错过了StringArrayToMultiString的最终\0 (你说明双重终止)? 如果数组是一个params string[]数组,则可能更容易调用 – 类似于:

  static string StringArrayToMultiString(params string[] values) { if (values == null) throw new ArgumentNullException("values"); StringBuilder multiString = new StringBuilder(); foreach (string s in values) { multiString.Append(s); multiString.Append('\0'); } return multiString.ToString(); } 

[关于最终\ 0的澄清后编辑]

我已经测试了StringArrayToMultiString方法,使用ChangeServiceConfig()函数来更改Windows服务的依赖关系,它适用于零,一个和多个字符串。

与此同时,我已经找到了解码从API调用接收的多字符串的解决方案。 例如,SCardListReaders()函数返回PC / SC阅读器名称的多字符串。 我宣称这是:

 [DllImport("winscard.dll", CharSet = CharSet.Auto)] static extern int SCardListReaders( IntPtr context, string groups, char[] readers, ref uint readersLen ); 

请注意,返回多字符串的readers参数声明为char []。 返回值很容易解析并转换为字符串集合:

 static string[] MultiStringToArray( char[] multistring ) { List stringList = new List(); int i = 0; while (i < multistring.Length) { int j = i; if (multistring[j++] == '\0') break; while (j < multistring.Length) { if (multistring[j++] == '\0') { stringList.Add(new string(multistring, i, j - i - 1)); i = j; break; } } } return stringList.ToArray(); } 

在RegistryKey.SetValue()和RegistryKey.GetValue()的MSDN文档中,示例分别简单地传入或转换为string []。 这有什么问题吗?