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

本文关键字:字符串 集合 转换 | 更新日期: 2023-09-27 17:48:49

多字符串(空分隔字符串的双空终止字符串)在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();
}

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

这可能很天真,但怎么样:

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<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();
}
在MSDN文档中的RegistryKey。SetValue()和RegistryKey。GetValue(),示例分别简单地传入或强制转换为字符串[]。这有什么问题吗?