从System.Text.Encoding.Unicode.GetString获取以null结尾的字符串

时间:2009-05-14 16:07:46

标签: .net encoding bytearray getstring

我有一个从外部实体收到的字节数组。它是固定的大小。这些字节包含一个unicode字符串,其中0个值填充缓冲区的其余部分:

所以字节可能是:

H \0 E \0 L \0 L \0 \0 \0 \0 \0 \0 ... etc 

我正在获取缓冲区并将其转换为如此字符串:

byte[] buffer = new byte[buffSize];
m_dataStream.Read(buffer, 0, buffSize);
String cmd = System.Text.Encoding.Unicode.GetString(buffer);

我得到的是一个看起来像这样的字符串:

"HELLO\0\0\0\0\0\0\0\0..."

如何告诉GetString在第一个Unicode null处终止字符串(即我只是回到“HELLO”)?

感谢您的任何意见。

4 个答案:

答案 0 :(得分:12)

如果你确定其余部分都是\ 0,那就可以了:

cmd = cmd.TrimEnd('\0');

否则,如果您只想在第一个null之前获取所有内容:

int index = cmd.IndexOf('\0');
if (index >= 0)
   cmd = cmd.Remove(index);

请注意,Unicode.GetString将处理双\ 0。你应该只找一个\ 0。

答案 1 :(得分:3)

最简单的方法是在转换后修剪字符串,如已经建议的那样。

如果您事先知道字符数,则可以使用GetString重载,该重载采用起始索引和字节数,以便获得正确的字符串,而不进行修剪。

如果您事先不知道字符数,并且希望避免在之后修剪字符串,则需要先修剪字节数组,这样您才能传递您感兴趣的字节。对于Unicode,这将意味着删除第一对零之后的任何字节。

答案 2 :(得分:3)

不是重新处理字符串,而是可以在缓冲区中第一次出现空字节(使用System.Array.IndexOf)。然后,您可以使用重载的System.Text.Encoding.Unicode.GetString方法创建一个达到给定缓冲区大小的字符串。

下面的示例还适用于不包含空字节的缓冲区:

byte[] buffer = new byte[buffSize];
m_dataStream.Read(buffer, 0, buffSize);
var size = System.Array.IndexOf(buffer, (byte)0);
String cmd = System.Text.Encoding.Unicode.GetString(buffer, 0, size < 0 ? buffSize : size);

答案 3 :(得分:-1)

您可以从 Stream.Read() 获取长度

int length = peerStream.Read(buffer, 0, buffer.Length);
receive = Encoding.UTF8.GetString(buffer, 0, length);