代码之家  ›  专栏  ›  技术社区  ›  DougN

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

  •  9
  • DougN  · 技术社区  · 17 年前

    我有一个从外部实体接收的字节数组。它是固定尺寸的。字节包含一个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”)?

    谢谢你的意见。

    3 回复  |  直到 8 年前
        1
  •  11
  •   Mehrdad Afshari    17 年前

    如果您确定剩下的都是\0,那么这将有效:

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

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

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

    注意 Unicode.GetString 将处理双\0。您应该只查找一个\0。

        2
  •  3
  •   driis    17 年前

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

    如果预先知道字符数,可以使用get string重载,它接受一个开始索引和一个字节数,以便获得正确的字符串,而不进行剪裁。

    如果您事先不知道字符数,并且希望以后避免修剪字符串,则需要先修剪字节数组,因此只传递感兴趣的字节。对于Unicode,这意味着删除第一对零之后的任何字节(包括第一对零)。

        3
  •  1
  •   Class Skeleton ˈvɔlə    8 年前

    不是重新处理字符串,而是可以在缓冲区中第一次出现空字节(使用 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);