2008-11-06 75 views
5

在Windows API中常见多个字符串(双空终止的空字符串串)。将从API返回的多字符串转换为C#字符串集合的好方法是什么?反之亦然?如何将多字符串转换为C#字符串集合/从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(); 
} 

回答

8

这可能是幼稚的,但如何:

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

而且 - 你不缺少最终 \0(幽州双无效终止)在 StringArrayToMultiString如果数组是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(); 
} 

+1

我认为\ 0已经在字符串中,当它通过COM发送时,意味着他需要一个\ 0而不是另一个。 – configurator 2008-11-06 15:09:40

2

我测试过的StringArrayToMultiString方法[澄清最终\ 0后编辑],使用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 
    ); 

注意,读者参数,返回多串,被声明为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(); 
} 
1

在MSDN文档RegistryKey.SetValue()和RegistryKey.GetValue(,这些例子只是传递,或流延到,串[ ], 分别。有什么问题吗?