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

2024-04-15

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

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

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

Thanks.


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

默认值字符集 http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0/index.jsp?topic=/com.ibm.mq.amqtan.doc/wc11820_.htm属性是 1200 (UNICODE) 并且写字符串 http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0/index.jsp?topic=/com.ibm.mq.amqtan.doc/wc11820_.htm转换为CharacterSet指定的代码页。

代码页 1200 是 UTF-16 小尾数法,因此每个字符可能会获得两个字节。 “Put Test Message”当然有可能使用某种其他编码,对常见字符使用每个字符一个字节。

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

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

您确定相信 Notepad++ 给您的计数吗?如果“放置测试消息”将 1799 个字符放入消息中,则您提供给消息的数据中可能有 1799 个字符。

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

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

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

这会将您的消息缩短至 1800 字节ifxml 字符串中的所有字符都有 ASCII 表示形式。

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 C# 将消息放入 Websphere MQ 的数据长度与手动放入相同消息的数据长度不同 的相关文章

随机推荐

  • 未捕获的语法错误:意外的令牌导出

    我用过创建反应应用程序对于我的项目 我收到一个错误 未捕获的语法错误 意外的令牌导出 错误就在这段代码中 export const ENGLISH lang en messages nav translatedMessage Social
  • 使用 Apache Maths 进行多项式回归 (Java)

    有人可以帮我用 Apache Math 库进行多项式回归 2 阶 吗 以下数据应给出此方程 39 79 x 2 497 66 x 997 45 由 Excel 计算 r2 0 9998 coding style from http comm
  • 无法通过 AKS 上的 Azure 流量管理器和 Nginx Ingress 访问服务

    我在两个不同的区域有两个 AKS 集群作为主要集群和辅助集群 我想使用 Azure 流量管理器在主集群和辅助集群上进行基于优先级的端点监控和故障转移机制 我有两个服务 A 和 B 它们在相对路径上路由 服务 a and 服务 b分别 我在每
  • 如何在 python 3 及更高版本中永久删除文件?

    我想永久删除我用 python 代码创建的文件 我知道 os remove 等 但找不到任何特定的内容来永久删除文件 不想用未使用的文件填充垃圾箱 os remove已经是您正在寻找的了 它不会将东西发送到垃圾箱 它只是删除它们
  • 苹果商店拒绝iPhone申请的原因[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 谁能帮我了解苹果商店拒绝或提出反对提交任何iPhone申请的可能原因 以下是可能的原因 非官方的 从这里 http 10base t co
  • 如何将字节数组作为 UDT 属性从 VB6/VBA 传递到 C# COM DLL?

    我有一个 C 库 我试图将其公开给 VBA 我可以很好地将参数传递给函数 即 ref byte someArray 但传递对象或结构是行不通的 如果我尝试将字节数组作为类的属性传递 我会在 VB 中收到以下错误 函数或接口标记为受限 或者函
  • 导入 CSV,用 ; 分隔而不是 PowerShell

    我正在使用 CSV 来存储一些我想在 Powershell 中使用的信息 为了使 CSV 更 可读 我决定将每条信息放入单独的字段中 如果我使用import csv在powershell中 返回是这样的 Test1 Test2 Test3
  • Cakephp Auth: $this->Auth->login错误消息

    我正在使用身份验证组件 我在 beforeFilter 中设置 this gt Auth gt loginError 但我还有另一种可能性 如果用户输入的用户名和密码正确 但 User status pending 我怎样才能显示不同的消息
  • 如何限制 UITabBarController 上的选项卡数量?

    我有一个带有 UITabBarController 的 iPhone 应用程序 一切都很好 该应用程序的选项卡数量超出了显示屏纵向宽度所能显示的选项卡数量 因此我们总共看到 5 个选项卡 最后一个是 更多 选项卡 问题是 我们希望将一些 不
  • Android点击通知未打开附加的Activity

    我想在单击状态栏上的通知时打开一个活动 我在 StackOverflow 上看到过这个答案 但这些答案都不适合我 此问题仅出现在 Lollipop 设备上 最好的重现方法是 1 启动应用程序 2 后台应用程序 3 接收推送通知 4 单击通知
  • Jinja 对可变内容进行嵌套渲染

    假设我在变量 X 中有实际的 jinja 模板代码 假设 X 的内容是 some other variable 如何在渲染 X 内容的同时显示 X 例如 这不起作用 X 因为它只是将其渲染到屏幕 some other variable 而不
  • Android 软键盘遮挡 ScrollView 中的 EditText

    我有一个 TableLayout 它在 ScrollView 内填充 parent 一切都很完美 除了当显示软键盘时它遮盖了最后几个 EditText 从技术上讲 屏幕无法再向下滚动 因为如果不显示键盘 屏幕就会容纳所有内容 只是当键盘显示
  • 获取多选列表框的选定值

    我有一个多选模式的列表框 它与数据库中的 15 个值绑定数据 我有以下代码来显示列表框中选定的每个项目的选定值 foreach var list in list box SelectedItems MessageBox Show list
  • 这里不允许使用 oracle 列

    我收到这个错误 Error report ORA 00984 column not allowed here ORA 06512 at line 14 00984 00000 column not allowed here 这是代码 我复制
  • 如何最好地使用 ASP.NET MVC 中的 Expires 标头?

    我希望能够为用户通过 GET 请求下载的某些项目设置较长的过期时间 我想说 这对于 10 分钟来说很好 即我想将 Expires 标头设置为 10 分钟 这些请求是通过 AJAX 在页面中显示的 HTML 片段 它们对用户会话很有好处 我不
  • jQuery imgAreaSelect 隐藏/显示?

    我一直在尝试隐藏和展示imgAreaSelect选择框取决于是否选中复选框 我试过了 var ias photo imgAreaSelect instance true ias setOptions show false 但它似乎没有做任何
  • 如何通过指定 Gnuplot 脚本内的所有点来绘制数据而无需单独的文件?

    我的程序生成调用 gnuplot 的 bash 脚本 我不想创建额外的文件来存储数据 有什么方法可以显式调用所有值吗 或者可能让 bash 创建一个临时文件 就像是 plot 1 5 2 10 3 1 就是我正在寻找的 您可以使用内联数据的
  • 如何避免使用全局变量? (python - Flask-socketio 应用程序)

    我试图弄清楚如何不为我的应用程序使用全局变量 但我想不出其他任何东西 实际上 我正在 Flask SocketIO 模块的帮助下编写一个 Web 界面 以便与音乐播放器实时交互 这是我的代码片段 其中包含 play 函数 我想我只需要一个示
  • 在函数装饰器中使用 pytest 夹具

    我想为我的测试函数构建一个有多种用途的装饰器 其中之一是帮助将属性添加到生成的junitxml 我知道有一个fixture https docs pytest org en latest usage html record property
  • 通过 C# 将消息放入 Websphere MQ 的数据长度与手动放入相同消息的数据长度不同

    MQMessage queueMessage new MQMessage queueMessage WriteString strInputMsg queueMessage Format MQC MQFMT STRING MQPutMess