2011-08-11 108 views
8
MQMessage queueMessage = new MQMessage(); 
       queueMessage.WriteString(strInputMsg); 
       queueMessage.Format = MQC.MQFMT_STRING; 
       MQPutMessageOptions queuePutMessageOptions = new MQPutMessageOptions(); 
       Queue.Put(queueMessage, queuePutMessageOptions); 

使用C#,與上面的代碼中,當我輸入該消息放入隊列中,消息的數據長度是3600通過C#把消息在WebSphere MQ具有比手動把相同的消息

不同的數據長度

當我手動輸入信息到通過右鍵單擊隊列,然後選擇把測試消息選項,隊列,消息的數據長度爲1799

我真的很困惑,爲什麼是這種情況。這兩種情況下的消息都是一個帶聲明的xml字符串。在Notepad ++中,有1811個字符包括聲明。當我在輸入隊列之前在調試器中查看消息時,消息將被轉換爲xml,而無需任何行或返回車廂。

我創建使用XML字符串:

//converts string message into xml by serializing it 
public string GetMessage(MyMessage messageInstance) 
{ 

// Serialize the request 
      XmlSerializer xsr = new XmlSerializer(typeof(MyMessage)); 
      MemoryStream memoryStream = new MemoryStream(); 
      XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); 
      xsr.Serialize(xmlTextWriter, messageInstance); 

      memoryStream = (MemoryStream)xmlTextWriter.BaseStream; 
      string XmlizedString = new UTF8Encoding().GetString((memoryStream.ToArray()); 


      // Encode the xml 
      Encoding utf = Encoding.UTF8; 
      byte[] utfBytes = utf.GetBytes(XmlizedString); 

      // Load the document (XmlResolver is set to null to ingore DTD) 
      XmlDocument xmlDoc = new XmlDocument(); 
      xmlDoc.XmlResolver = null; 
      xmlDoc.LoadXml(utf.GetString(utfBytes)); 
      return utf.GetString(utfBytes); 

我缺少的是增加額外的角色我的C#實現什麼?

謝謝。

+2

UTF8 vs ASCII? – Matten

回答

12

由於@Matten表明一個問題可能是字符編碼。

CharacterSet屬性的默認值爲1200(UNICODE),並且WriteString將轉換爲由CharacterSet指定的代碼頁。

代碼頁1200是UTF-16小端,所以你很可能每個字符得到兩個字節。 「Put Test Message」確實有可能使用其他編碼,每個字符使用一個字節作爲常用字符。

假設3600和1799長度以字節計算,它們可以表示1800個UTF-16LE字符和1799個UTF-8字符(或1799個ASCII字符或1799個EBCDIC字符......)。

這仍然給我們留下一個字符的長度差異。也許WriteString在寫入的字符串中包含終止的NULL字符?

您確定您相信記事本++提供給您的計數嗎?如果放置測試消息將1799個字符放入消息中,那麼您提供給它的數據中可能有1799個字符。

編輯:假設編碼理論是正確的,你可以通過使用不同的編碼來縮短消息。編碼如何縮短特定消息將取決於字符串的實際內容。

例如,您可以使用ASCII編碼來獲取每個字符一個字節。

MQMessage queueMessage = new MQMessage(); 
queueMessage.CharacterSet = 437; // Set code page to ASCII 

這會縮短你的消息,1800個字節如果所有字符在XML字符串有一個ASCII表示。

另一種方法是使用UTF-8編碼。

MQMessage queueMessage = new MQMessage(); 
queueMessage.CharacterSet = 1208; // Set code page to UTF-8 

使用UTF-8的優點是(與ASCII不同)所有字符都有一個表示(對於某些'all'值)。缺點是某些字符需要兩個,三個甚至四個字節來表示它們。最常見的字符以一個字節編碼,然後下一個最常用的字符以兩個字節編碼,依此類推。

在最好的情況下,UTF-8編碼也會給你1800個字節。在最壞的情況下,它會給你7200字節,但這似乎不太可能,除非你使用的是類似克林貢的東西!

+0

如何確保輸入的字符串是1799個字符而不是3600? – InfoLearner

+1

謝謝弗蘭克你救了一天! – PAVITRA

+0

另外,正如我剛剛發現的 - 如果將字符集設置爲1208(UTF),請確保使用WriteString而不是WriteUTF,因爲這基本上是UTF編碼的UTF! – nik0lias