2012-06-14 23 views
2

我創建一個類並將其轉換爲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'看,如果你斷點'字節] ascArray = Encoding.ASCII.GetBytes(XmlizedString像);' –

+0

這很奇怪,它有領先的?也只是如果我複製/粘貼到XmlizedString的內容纔可見 – Erik

+0

那麼爲什麼UTF8ByteArrayToString增加一個額外的字節 – Erik

回答

4

我強烈懷疑該數據與byte order mark,無法通過ASCII表示開始。

不清楚爲什麼你要做的是你在做什麼,尤其是在MemoryStream。你爲什麼要創建一個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. 
+0

我想將這個類發送給一個java客戶端。這就是爲什麼我首先將類轉換爲XML然後轉換爲字節。 – Erik

+0

@Erik:但是你將它直接轉換爲字節,存儲在'MemoryStream'中。你爲什麼然後將它轉換爲一個字符串,然後*返回*字節,使用錯誤的編碼?爲什麼你甚至使用'MemoryStream'而不是直接從'clientStream'創建'XmlTextWriter'? –

+0

真的:)這不是正確的源代碼 – Erik

相關問題