2008-11-06 35 views
5

Multistrings (chuỗi rỗng được phân tách bằng chuỗi rỗng) là phổ biến trong API Windows. Một phương pháp tốt để chuyển đổi một multistring trở về từ một API thành một bộ sưu tập chuỗi C# và ngược lại là gì?Làm thế nào để bạn chuyển đổi multistring đến/từ bộ sưu tập chuỗi C#?

Tôi đặc biệt quan tâm đến việc xử lý thích hợp mã hóa ký tự (Windows XP sau này).

Phương pháp sau đây có vẻ không quan trọng đối với việc tạo nhiều câu, nhưng tôi không có ví dụ về giải mã một câu hỏi nhiều.

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

Trả lời

8

Điều này có thể ngây thơ, nhưng làm thế nào về:

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

Ngoài ra - không bạn thiếu thức \0 (bạn được nhà nước đúp null-terminated) trong StringArrayToMultiString? Và nó có thể được dễ dàng hơn để gọi nếu mảng là một mảng params string[] - một cái gì đó như:

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

[sửa sau khi làm rõ về thức \ 0]

+1

Tôi nghĩ rằng \ 0 đã có trong chuỗi khi nó được gửi qua COM, có nghĩa là anh ta sẽ cần một \ 0 nhưng không phải là khác. – configurator

+1

Vâng, đó là chính xác - khi một chuỗi được chuyển đến một API Win32, nó là null-chấm dứt. Vì vậy, không cần phải thêm \ 0 cuối cùng. Một chuỗi nhiều không được chứa chuỗi trống. Điều đó có nghĩa là một chuỗi rỗng "" thường là một multistring hợp pháp không có mục nhập nào. –

+0

OK, cập nhật sau đó –

2

Tôi đã thử nghiệm phương pháp StringArrayToMultiString, sử dụng ChangeServiceConfig() chức năng để thay đổi các phụ thuộc của một dịch vụ Windows, và nó hoạt động độc đáo cho số không, một và nhiều chuỗi.

Trong thời gian chờ đợi, tôi đã làm việc ra một giải pháp để giải mã một loạt nhận được từ một cuộc gọi API. Ví dụ, các SCardListReaders() chức năng trả về một multistring của PC/SC đọc tên. Tôi đã tuyên bố điều này là:

[DllImport("winscard.dll", CharSet = CharSet.Auto)] 
static extern int SCardListReaders(
    IntPtr context, 
    string groups, 
    char[] readers, 
    ref uint readersLen 
    ); 

Lưu ý rằng tham số người đọc trả về nhiều câu được khai báo là char []. Giá trị trả về có thể dễ dàng phân tích và chuyển đổi thành một bộ sưu tập các chuỗi:

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

Trong tài liệu MSDN cho RegistryKey.SetValue() và RegistryKey.GetValue(), các ví dụ đơn giản là vượt qua trong, hay ép thành, string [ ], tương ứng. Có điều gì sai trái với điều đó không?

Các vấn đề liên quan