2012-06-14 6 views
2

Im создает класс и преобразует его в xml.Почему ASCII.GetBytes возвращает неправильные байты

Проблема заключается в том, что, когда я преобразовать XML-строку класса в байтах
ASCII.GetBytes возвращает массив с
дополнительный характер в начале ascArray

Это всегда? так что xml начинается следующим образом:

?<?xml version="1.0" encoding="utf-8"?> 

Почему это происходит?

Это код:

WorkItem p = new WorkItem(); 

    // Fill the class with whatever need to be sent to client 
    OneItem posts1 = new OneItem(); 
    posts1.id = "id 1"; 
    posts1.username = "hasse"; 
    posts1.message = "hej again"; 
    posts1.time = "time1"; 
    p.setPost(posts1); 

    OneItem posts2 = new OneItem(); 
    posts2.id = "id 2"; 
    posts2.username = "bella"; 
    posts2.message = "hej again again"; 
    posts2.time = "time2"; 
    p.setPost(posts2); 

    // convert the class WorkItem to xml 
    MemoryStream memoryStream = new MemoryStream(); 
    XmlSerializer xs = new XmlSerializer(typeof(WorkItem)); 
    XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); 
    xs.Serialize(xmlTextWriter, p); 

    // send the xml version of WorkItem to client 
    byte[] data = memoryStream.ToArray(); 
    clientStream.Write(data, 0, data.Length); 
    Console.WriteLine(" send.." + data); 
    clientStream.Close(); 
+0

Как вход 'XmlizedString' выглядеть, если вы останова на' Byte [] = ascArray Encoding.ASCII.GetBytes (XmlizedString); ' –

+0

Это странно, у него есть ведущий? также, но это видно только в том случае, если я копирую/вставляю содержимое XmlizedString – Erik

+0

Итак, почему UTF8ByteArrayToString добавляет дополнительный байт – Erik

ответ

4

Я сильно подозреваю, что данные начинаются с byte order mark, которые не могут быть представлены в ASCII.

Непонятно, почему вы делаете то, что делаете в первую очередь, особенно в районе MemoryStream. Почему вы создаете кодированный байтовый массив UTF-8, а затем декодируете это для строки (и мы не знаем, что делает UTF8ByteArrayToString), а затем преобразовывая ее назад в массив байтов? Почему бы просто не написать массив байтов прямо к клиенту, чтобы начать? Если вам нужны данные в виде строки, я бы использовал подкласс StringWriter, который сообщает, что он использует UTF-8 в качестве кодировки. Если вы не, вам нужно это как строку, просто придерживайтесь массива байтов.

Обратите внимание, что даже в стороне от этого первого символа факт, что у вас есть документ XML, закодированный в UTF-8, может означать, что в строке могут быть другие символы, отличные от ASCII. Почему вы вообще используете ASCII?

EDIT: Для того, чтобы быть понятным, вы принципиально применяете преобразование с потерями, и делаем это без необходимости. Даже если вы хотите локальную копию данных, вы должны иметь что-то вроде этого:

// 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. 
+0

Я хочу отправить класс в java-клиент. Вот почему я сначала конвертирую класс в XML, а затем в байты. – Erik

+0

@Erik: Но вы конвертируете его * напрямую * в байты в «MemoryStream». Почему вы затем конвертируете его в строку, а затем * назад * в байты, используя неправильную кодировку? Почему вы даже используете 'MemoryStream' вместо того, чтобы создавать' XmlTextWriter' прямо из 'clientStream'? –

+0

действительно :), что было неправильно с курсом – Erik

Смежные вопросы