Que eu saiba, nenhuma das respostas dadas garante um comportamento correto com terminação nula. Até que alguém me mostre de maneira diferente, escrevi minha própria classe estática para lidar com isso com os seguintes métodos:
// 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);
}
A razão para isso startIndex
foi no exemplo em que eu estava trabalhando especificamente, que eu precisava analisar a byte[]
como uma matriz de seqüências terminadas nulas. Pode ser ignorado com segurança no caso simples