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

时间:2008-11-06 14:39:27

标签: c# winapi string

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

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

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

static string StringArrayToMultiString(
    ICollection<string> stringArray
    )
{
    StringBuilder multiString = new StringBuilder();


    if (stringArray != null)
    {
        foreach (string s in stringArray)
        {
            multiString.Append(s);
            multiString.Append('\0');
        }
    }

    return multiString.ToString();
}

3 个答案:

答案 0 :(得分:8)

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

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

<击> 另外 - 您是不是错过\0中的最终StringArrayToMultiString(您声明双重终止)?如果数组是{{1},则可能更容易调用} array - 类似于:

params string[]

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

答案 1 :(得分:2)

我已经测试了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<string> stringList = new List<string>();
    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();
}

答案 2 :(得分:1)

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

相关问题