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

编码为UTF-8而不是ASCII后,无法读取流中的整数

  •  1
  • Hedge  · 技术社区  · 15 年前

    我对ASCII中的元音变调有问题,所以我现在将流编码为UTF-8,这很有效,但它带来了一个问题。我通常在ARTIST之前读取4个字节来确定ARTIST=的长度

    UTF8Encoding enc = new UTF8Encoding();
    string response = enc.GetString(message, 0, bytesRead);
    int posArtist = response.IndexOf("ARTIST");
    BitConverter.ToInt32(message, posArtist - 4);
    

    这完全适用于ASCII。

    十六进制编辑器示例只是为了说明读取长度不再像使用ASCII那样工作

    以下是十六进制编辑器的屏幕截图示例: alt text

    “ARTIST=M.A.N.D.Y.vs.Booka Shade”长度=21

    但是,这对UTF8编码的流不起作用。 这是一张截图: alt text

    “ARTIST=Paulseq”Length=E,但在图片中是2E。

    我在这里做错什么了?

    4 回复  |  直到 15 年前
        1
  •  4
  •   pm100    15 年前

    您的数据是错误的-您实际上在应该有二进制零的数据中有字符“\0”

    问题在于如何创建这些数据,而不是读取数据

        2
  •  3
  •   Hans Passant    15 年前

    你是如何从ASCII数据中得到21的,这完全是个谜。阴影字节是十六进制的,其实际值为33。你不可能得到21个位转换器.ToInt32,这需要字节值(十六进制)15 00 00 00。

    这一定是偶然发生的,但不知道那次事故会是什么样子。发布更多代码,包括编写此代码的代码。

        3
  •  3
  •   Tergiver    15 年前

    我猜你是在混合工具。这是一个二进制流。应该使用BinaryReader读取它,并使用BinaryWriter编写它。在编写文本时,请使用编码器.GetBytes获取要写入的原始字节,并在读取时使用编码器.GetString在读取的原始字节上。BinaryWriter/Reader有直接用于值(如长度)的方法。

        4
  •  2
  •   Will    15 年前

    只有字符串应该是UTF-8编码/解码的。如果以二进制形式传递其他(非字符串)值,它们将销毁编码器。