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