gpt4 book ai didi

c# - 通过 C# 将消息放入 Websphere MQ 与手动放置相同的消息具有不同的数据长度

转载 作者:数据小太阳 更新时间:2023-10-29 01:44:38 24 4
gpt4 key购买 nike

MQMessage queueMessage = new MQMessage();
queueMessage.WriteString(strInputMsg);
queueMessage.Format = MQC.MQFMT_STRING;
MQPutMessageOptions queuePutMessageOptions = new MQPutMessageOptions();
Queue.Put(queueMessage, queuePutMessageOptions);

使用C#,通过上面的代码,当我向队列中输入消息时,消息的数据长度为3600。

当我通过右键单击队列并选择 Put Test Message 选项手动将消息输入队列时,消息的数据长度为 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# 实现中是否遗漏了任何添加额外字符的内容?

谢谢。

最佳答案

正如@Matten 所说,一个问题可能是字符编码。

CharacterSet 的默认值属性是 1200 (UNICODE) 和 WriteString转换为 CharacterSet 指定的代码页。

代码页 1200 是 UTF-16 little-endian,因此每个字符可能有两个字节。 “Put Test Message”当然有可能使用一些其他编码,每个字符一个字节用于普通字符。

假设 3600 和 1799 的长度以字节计算,它们可以表示 1800 个 UTF-16LE 字符和 1799 个 UTF-8 字符(或 1799 个 ASCII 字符或 1799 个 EBCDIC 字符...)。

这仍然让我们在长度上有一个字符的差异。也许 WriteString 在写入的字符串中包含终止 NULL 字符?

你确定你相信 Notepad++ 给你的计数吗?如果 Put Test Message 将 1799 个字符放入消息中,则您提供给它的数据中可能有 1799 个字符。

编辑:假设编码理论是正确的,您可以使用不同的编码来缩短消息。编码使特定消息有多短取决于字符串的实际内容。

例如,您可以使用 ASCII 编码为每个字符获取一个字节。

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

如果您的 xml 字符串中的所有字符都具有 ASCII 表示,那么这会将您的消息缩短到 1800 字节。

另一种方法是使用 UTF-8 编码。

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

使用 UTF-8 的优点是(与 ASCII 不同)所有字符都有一个表示(对于“all”的某些值)。缺点是有些字符需要两个、三个甚至四个字节来表示。最常见的字符以一个字节编码,然后下一个最常见的字符以两个字节编码,依此类推。

在最好的情况下,UTF-8 编码也将为您提供 1800 个字节。在最坏的情况下,它会给你 7200 字节,但这似乎不太可能,除非你使用 Klingon 之类的东西!

关于c# - 通过 C# 将消息放入 Websphere MQ 与手动放置相同的消息具有不同的数据长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7030277/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com