当前位置: 首页 > 编程语言 > C#

通过C#将消息放入WebsphereMQ与手动放置相同的消息有不同的数据长度分享

时间:2023-04-10 14:18:25 C#

C#通过C#将消息放入WebsphereMQ与手动放置相同的消息有不同的数据长度MQMessagequeueMessage=newMQ消息();queueMessage.WriteString(strInputMsg);queueMessage.Format=MQC.MQFMT_STRING;MQPutMessageOptionsqueuePutMessageOptions=newMQPutMessageOptions();Queue.Put(queueMessage,queuePutMessageOptions);,消息的数据长度为3600。当我通过右键单击队列并选择PutTestMessage选项手动将消息输入队列时,消息的数据长度为1799。我真的很困惑为什么会这样。两种情况下的消息都是带有声明的xml字符串。在Notepad++中,有1811个字符,包括声明。当我在进入队列之前在调试器中查看消息时,消息被转换为xml,没有返回任何行或回车。我使用以下方法创建了xml字符串://通过序列化将字符串消息转换为xml公共字符串GetMessage(MyMessagemessageInstance){//序列化请求XmlSerializerxsr=newXmlSerializer(typeof(MyMessage));MemoryStreammemoryStream=newMemoryStream();XmlTextWriterxmlTextWriter=newXmlTextWriter(memoryStream,Encoding.UTF8);xsr.Serialize(xmlTextWriter,messageInstance);memoryStream=(MemoryStream)xmlTextWriter.BaseStream;stringXmlizedString=newUTF8Encoding().GetString((memoryStream.ToArray();//对xml编码进行编码utf=Encoding.UTF8;byte[]utfBytes=utf.GetBytes(XmlizedString);//加载文档(设置了XmlResolver为nulltoingoreDTD)XmlDocumentxmlDoc=newXmlDocument();xmlDoc.XmlResolver=null;xmlDoc.LoadXml(utf.GetString(utfBytes));returnutf.GetString(utfBytes);我是否遗漏了C#实现中要添加的任何内容额外的字符?谢谢。正如@Matten所说,问题可能是字符编码。CharacterSet属性的默认值为1200(UNICODE),WriteString将转换为CharacterSet指定的代码页。代码页1200是UTF-16little-endian,因此每个字符可能有两个字节。“PutTestMessage”当然可以使用一些其他编码,每个字符一个字节用于普通字符。假设3600和1799的长度以字节为单位计算,它们可以表示1800个UTF-16LE字符和1799个UTF-8字符(或者1799个ASCII字符或者1799个EBCDIC字符……)。这仍然给我们留下了一个字符的长度差异。也许WriteString在字符串中包含一个终止NULL字符?你确定你相信Notepad++给你的计数吗?如果PutTestMessage将1799个字符放入消息中,那么您提供给它的数据可能包含1799个字符。编辑:假设编码理论是正确的,您可以使用不同的编码来缩短消息。特定消息的编码有多短暂取决于字符串的实际内容。例如,您可以使用ASCII编码为每个字符获取一个字节。MQMessagequeueMessage=newMQMessage();queueMessage.CharacterSet=437;//将代码页设置为ASCII如果xml字符串中的所有字符都具有ASCII表示,这会将您的消息缩短为1800字节。另一种方法是使用UTF-8编码。MQMessagequeueMessage=newMQMessage();queueMessage.CharacterSet=1208;//将代码页设置为UTF-8使用UTF-8的优点是(与ASCII不同)所有字符都具有一种表示形式(对于'all'的某些值)。缺点是有些字符需要两个、三个甚至四个字节来表示它们。最常见的字符以一个字节编码,然后下一个最常见的字符以两个字节编码,依此类推。UTF-8编码在最好的情况下也将为您提供1800个字节。在最坏的情况下,它会给你7200字节,但这似乎不太可能,除非你使用像克林贡语这样的东西!以上是C#学习教程:通过C#将消息放入WebsphereMQ的数据长度与手动放置相同消息的数据长度不同。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: