将其编码为UTF-8而不是ASCII后,无法读取Stream中的Integer

时间:2010-10-08 20:34:25

标签: c# .net encoding

我在ASCII中使用Umlauts时出现问题所以我现在将我的Stream编码为UTF-8,这有效,但它会带来一个问题。我通常在ARTIST之前阅读4字节,以确定ARTIST = WHOEVER的长度

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。与Booka Shade对比”长度= 21

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

“ARTIST = Paulseq”长度= E但在图片中为2E。

我在这里做错了什么?

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

如何从ASCII数据中获得21个是完全神秘的。阴影字节为十六进制,其实际值为33.您无法从BitConverter.ToInt32获得21,这需要字节值(十六进制)15 00 00 00。

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

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