Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么ASCII.GetBytes返回错误的字节_C#_Xml_Encoding_Ascii - Fatal编程技术网

C# 为什么ASCII.GetBytes返回错误的字节

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的作用),然后将

我正在创建一个类并将其转换为xml

问题是,当我将类xml字符串转换为字节时
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字节顺序标记