我有一个从外部实体收到的字节数组。它是固定的大小。这些字节包含一个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”)?
感谢您的任何意见。
答案 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);