C# 为什么ASCII.GetBytes返回错误的字节
我正在创建一个类并将其转换为xml 问题是,当我将类xml字符串转换为字节时C# 为什么ASCII.GetBytes返回错误的字节,c#,xml,encoding,ascii,C#,Xml,Encoding,Ascii,我正在创建一个类并将其转换为xml 问题是,当我将类xml字符串转换为字节时 ASCII.GetBytes返回带有 ascArray 这总是一个好主意?字符,因此xml的开头如下 ?<?xml version="1.0" encoding="utf-8"?> 我强烈怀疑数据以a开头,而a不能用ASCII表示 现在还不清楚你为什么要这么做,尤其是在内存流中。为什么要创建UTF-8编码的字节数组,然后将其解码为字符串(我们不知道UTF8ByteArrayToString的作用),然后将
ASCII.GetBytes
返回带有ascArray
这总是一个好主意?字符,因此xml的开头如下
?<?xml version="1.0" encoding="utf-8"?>
我强烈怀疑数据以a开头,而a不能用ASCII表示 现在还不清楚你为什么要这么做,尤其是在
内存流
中。为什么要创建UTF-8编码的字节数组,然后将其解码为字符串(我们不知道UTF8ByteArrayToString
的作用),然后将其转换回字节数组?为什么不直接将字节数组写入客户端呢?如果您需要数据作为字符串,我将使用StringWriter
的子类,该子类声明它使用UTF-8作为编码。如果不需要将其作为字符串,只需使用字节数组即可
请注意,即使除了第一个字符之外,还有一个用UTF-8编码的XML文档,这意味着字符串中可能还有其他非ASCII字符。你为什么在这里使用ASCII码
编辑:只是要澄清一下,您基本上是在应用有损转换,而且这样做是不必要的。即使您想要数据的本地副本,您也应该有如下内容:
// Removed bad try/catch block - don't just catch Exception, and don't
// just swallow exceptions
MemoryStream memoryStream = new MemoryStream();
XmlSerializer xs = new XmlSerializer(typeof(WorkItem));
XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
xs.Serialize(xmlTextWriter, p);
// Removed pointless conversion to/from string
// Removed pointless BinaryWriter (just use the stream)
// An alternative would be memoryStream.WriteTo(clientStream);
byte[] data = memoryStream.ToArray();
clientStream.Write(data, 0, data.Length);
Console.WriteLine(" send.." + data);
// Removed Close calls - you should use "using" statements to dispose of
// streams automatically.
我强烈怀疑数据以a开头,而a不能用ASCII表示 现在还不清楚你为什么要这么做,尤其是在
内存流
中。为什么要创建UTF-8编码的字节数组,然后将其解码为字符串(我们不知道UTF8ByteArrayToString
的作用),然后将其转换回字节数组?为什么不直接将字节数组写入客户端呢?如果您需要数据作为字符串,我将使用StringWriter
的子类,该子类声明它使用UTF-8作为编码。如果不需要将其作为字符串,只需使用字节数组即可
请注意,即使除了第一个字符之外,还有一个用UTF-8编码的XML文档,这意味着字符串中可能还有其他非ASCII字符。你为什么在这里使用ASCII码
编辑:只是要澄清一下,您基本上是在应用有损转换,而且这样做是不必要的。即使您想要数据的本地副本,您也应该有如下内容:
// Removed bad try/catch block - don't just catch Exception, and don't
// just swallow exceptions
MemoryStream memoryStream = new MemoryStream();
XmlSerializer xs = new XmlSerializer(typeof(WorkItem));
XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
xs.Serialize(xmlTextWriter, p);
// Removed pointless conversion to/from string
// Removed pointless BinaryWriter (just use the stream)
// An alternative would be memoryStream.WriteTo(clientStream);
byte[] data = memoryStream.ToArray();
clientStream.Write(data, 0, data.Length);
Console.WriteLine(" send.." + data);
// Removed Close calls - you should use "using" statements to dispose of
// streams automatically.
如果在
Byte[]ascArray=Encoding.ASCII.GetBytes(XmlizedString)处设置断点,则输入的XmlizedString
看起来如何代码>这很奇怪,它有领先优势?但它只有在复制/粘贴到XMLIzedStrings的内容时才可见,所以为什么UTF8ByteArrayToString添加了一个额外的byte@Erik:不是。您应该查看传递给UTF8ByteArray
的字节数组。我很确定你会发现它以0xEF,0xBB,0xBF开头,这是字节顺序标记的UTF-8表示形式。这被UTF8ByteArrayToString
解码为单个字符(不是字节)-但该字符不能用ASCII表示。基本上,您在这里应用的是有损转换。如果您在Byte[]ascArray=Encoding.ASCII.GetBytes(XmlizedString)处设置断点,输入的XmlizedString
会是什么样子代码>这很奇怪,它有领先优势?但它只有在复制/粘贴到XMLIzedStrings的内容时才可见,所以为什么UTF8ByteArrayToString添加了一个额外的byte@Erik:不是。您应该查看传递给UTF8ByteArray
的字节数组。我很确定你会发现它以0xEF,0xBB,0xBF开头,这是字节顺序标记的UTF-8表示形式。这被UTF8ByteArrayToString
解码为单个字符(不是字节)-但该字符不能用ASCII表示。基本上,这里应用的是有损转换。我想将该类发送到java客户机。这就是为什么我先将类转换为XML,然后再转换为字节。@Erik:但您是在内存流中直接将其转换为字节。为什么要使用错误的编码将其转换为字符串,然后再转换回字节?你为什么要用内存流
而不是直接从客户端流
创建XmlTextWriter
?@Erik:我用更好的代码编辑了我的答案,包括一堆解释我所做的事情的注释。现在我一开始就有更多的坏字符,这三个“字符”绝对是我想要发送给java客户机的UTF-8字节顺序标记。这就是为什么我先将类转换为XML,然后再转换为字节。@Erik:但您是在内存流中直接将其转换为字节。为什么要使用错误的编码将其转换为字符串,然后再转换回字节?你为什么要用内存流
而不是直接从客户端流
创建XmlTextWriter
?@Erik:我用更好的代码编辑了我的答案,包括一堆解释我所做的事情的注释。现在我一开始就有更多的坏字符,这三个“字符”绝对是UTF-8字节顺序标记