我有从外部实体收到的字节的阵列。这是一个固定的大小。该字节包含一个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空字符串(即所以我只是回来“HELLO”)?

感谢您的任何输入

有帮助吗?

解决方案

如果你确定其余全\ 0,这将工作:

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

否则,如果你只是想获得第一个零点之前的一切:

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

请注意Unicode.GetString会照顾的双\ 0的。你应该找一个'\ 0。

其他提示

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

如果你事先知道的字符数,你可以使用GetString重载需要开始索引和字节计数,以获得正确的字符串,没有修剪。

如果你不提前知道的字符数,并且想避免事后修剪字符串,你需要先修剪字节数组,所以你只能通过你感兴趣的字节。对于Unicode,这意味着去除之后的任何字节,并且包括第一对零的。

,而不是重新处理该字符串可以(使用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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top