Theo hiểu biết của tôi, không có câu trả lời nào được đưa ra đảm bảo hành vi đúng với chấm dứt null. Cho đến khi ai đó chỉ cho tôi khác đi, tôi đã viết lớp tĩnh của riêng mình để xử lý việc này bằng các phương thức sau:
// Mimics the functionality of strlen() in c/c++
// Needed because niether StringBuilder or Encoding.*.GetString() handle \0 well
static int StringLength(byte[] buffer, int startIndex = 0)
{
int strlen = 0;
while
(
(startIndex + strlen + 1) < buffer.Length // Make sure incrementing won't break any bounds
&& buffer[startIndex + strlen] != 0 // The typical null terimation check
)
{
++strlen;
}
return strlen;
}
// This is messy, but I haven't found a built-in way in c# that guarentees null termination
public static string ParseBytes(byte[] buffer, out int strlen, int startIndex = 0)
{
strlen = StringLength(buffer, startIndex);
byte[] c_str = new byte[strlen];
Array.Copy(buffer, startIndex, c_str, 0, strlen);
return Encoding.UTF8.GetString(c_str);
}
Lý do startIndex
là trong ví dụ tôi đang làm việc cụ thể tôi cần phân tích cú pháp byte[]
dưới dạng một chuỗi các chuỗi kết thúc null. Nó có thể được bỏ qua một cách an toàn trong trường hợp đơn giản