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

如何将多字符串转换为C#字符串集合或从C#字符串集合转换为多字符串?,c#,winapi,string,C#,Winapi,String,多字符串(空分隔字符串的双空终止字符串)在Windows API中很常见。将API返回的多字符串转换为C#字符串集合或将C#字符串集合转换为C#字符串集合的好方法是什么 我对正确处理字符编码特别感兴趣(WindowsXP及更高版本) 下面的方法似乎可以创建多字符串,但我没有解码多字符串的示例 static string StringArrayToMultiString( ICollection<string> stringArray ) { StringBui

多字符串(空分隔字符串的双空终止字符串)在Windows API中很常见。将API返回的多字符串转换为C#字符串集合或将C#字符串集合转换为C#字符串集合的好方法是什么

我对正确处理字符编码特别感兴趣(WindowsXP及更高版本)

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

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();
}
静态字符串StringArrayToMultiString(
ICollection字符串数组
)
{
StringBuilder多字符串=新的StringBuilder();
if(stringArray!=null)
{
foreach(stringArray中的字符串s)
{
多字符串追加;
multiString.Append('\0');
}
}
返回multiString.ToString();
}

这可能很幼稚,但是:

static string[] MultiStringToArray(string multiString)
{
    return multiString.TrimEnd('\0').Split('\0');
}
另外-您是否缺少
StringArrayToMultiString
中的最后一个
\0
(您声明以双null结尾)?如果数组是
params string[]
array,调用起来可能会更容易一些,比如:

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

[在澄清final\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();
}
static string[]MultiStringToArray(
char[]多字符串
)
{
List stringList=新列表();
int i=0;
while(i
在RegistryKey.SetValue()和RegistryKey.GetValue()的MSDN文档中,示例仅分别传入或强制转换为字符串[]。这有什么问题吗?

我认为通过COM发送时,字符串中已经有一个\0,这意味着他需要一个\0,而不是另一个。是的,这是正确的——当字符串传递到Win32 API时,它以null结尾。因此,无需添加最后一个\0。多字符串不能包含空字符串。这意味着常规空字符串“”是不包含任何条目的合法多字符串。如果多字符串值包含完整的多字符串值,则MultiStringToArray()方法可以很好地工作,但问题是如何从API调用中获取该值。这里的TrimEnd可以通过
multistring.Split忽略('\0',StringSplitOptions.RemoveEmptyEntries)
,因为空字符串不能存储在以双null结尾的列表中。