如何将多字符串转换为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();
}
这可能很天真,但怎么样:
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();
}