通过 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 的数据长度与手动放入相同消息的数据长度不同 的相关文章

  • 分段错误(核心转储)错误

    我的程序编译罚款 但在输入文件时出现 分段错误 核心转储 错误 我没有正确处理 ostream 吗 include
  • C 程序从连接到系统的 USB 设备读取数据

    我正在尝试从连接到系统 USB 端口的 USB 设备 例如随身碟 获取数据 在这里 我可以打开设备文件并读取一些随机原始数据 但我想获取像 minicom teraterm 这样的数据 请让我知道我可以使用哪些方法和库来成功完成此操作以及如
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • 如何使用 Webpack 加载器导入 XML,而不自动转换为 JSON

    Webpack 4 的 xml loader 自动将导入的 XML 文件转换为 JSON 通过什么方式可以导入XMLwithout转换为 JSON XML 数据将使用现有的 应用程序专用的 XML 解析器进行处理 明确地说 我绝对愿意not
  • 从 C 结构生成 C# 结构

    我有几十个 C 结构 我需要在 C 中使用它们 典型的 C 结构如下所示 typedef struct UM EVENT ULONG32 Id ULONG32 Orgin ULONG32 OperationType ULONG32 Size
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • 如何使用MySqlCommand和prepare语句进行多行插入?(#C)

    Mysql 给出了如何使用准备语句和 NET 插入行的示例 http dev mysql com doc refman 5 5 en connector net programming prepared html http dev mysq
  • 将字符串转换为正确的 URI 格式?

    有没有简单的方法可以将电子邮件地址字符串转换为正确的 URI 格式 Input http mywebsite com validate email 3DE4ED727750215D957F8A1E4B117C38E7250C33 email
  • 如何在 C++ 中将 CString 转换为 double?

    我如何转换CString to a double在 C 中 Unicode 支持也很好 Thanks A CString可以转换为LPCTSTR 这基本上是一个const char const wchar t 在 Unicode 版本中 知
  • C# 委托责任链

    为了我的理解目的 我实现了责任链模式 Abstract Base Type public abstract class CustomerServiceDesk protected CustomerServiceDesk nextHandle
  • 分配器感知容器和propagate_on_container_swap

    The std allocator traits模板定义了一些常量 例如propagate on container copy move assign让其他容器知道它们是否应该在复制或移动操作期间复制第二个容器的分配器 我们还有propag
  • .NET 客户端中 Google 表格中的条件格式请求

    我知道如何在 Google Sheets API 中对值和其他格式进行批量电子表格更新请求 但条件格式似乎有所不同 我已正确设置请求 AddConditionalFormatRuleRequest formatRequest new Add
  • DataTable:通过 LINQ 或 LAMBDA 进行动态 Group By 表达式

    我有一个数据表 我想在其中对未指定数量的字段进行分组 发生这种情况的原因是用户可以选择他想要分组的字段 所以 实际上 我将选择推入列表中 在这个选择上 我必须对我的数据表进行分组 想象一下这段代码 VB 或 C 都一样 public voi
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • 使用 HTMLAgilityPack 从节点的子节点中选择所有

    我有以下代码用于获取 html 页面 将网址设置为绝对 然后将链接设置为 rel nofollow 并在新窗口 选项卡中打开 我的问题是关于将属性添加到 a s string url http www mysite com string s
  • 如何引用解决方案之外的项目?

    我有一个 Visual Studio C 解决方案 其中包含一些项目 其中一个项目需要引用另一个不属于解决方案的项目 一开始我引用了dll
  • 为什么 Linux 对目录使用 getdents() 而不是 read()?

    我浏览 K R C 时注意到 为了读取目录中的条目 他们使用了 while read dp gt fd char dirbuf sizeof dirbuf sizeof dirbuf code Where dirbuf是系统特定的目录结构
  • C++、三元运算符、std::cout

    如何使用 C 用三元运算符编写以下条件 int condition1 condition2 condition3 int double result int or double std cout lt lt condition1 resul
  • 带有私有设置器的 EFCore Base 实体模型属性 - 迁移奇怪的行为

    实体模型继承的类内的私有设置器似乎会导致 EFCore 迁移出现奇怪的问题 考虑以下示例 其中有多个类 Bar and Baz 继承自Foo 跑步时Add Migration多次命令 添加 删除private修饰符 生成的模式在多个方面都是
  • 以 UTF8 而不是 UTF16 输出 DataTable XML

    我有一个 DataTable 我正在使用 WriteXML 创建一个 XML 文件 尽管我在以 UTF 16 编码导出它时遇到问题 并且似乎没有明显的方法来更改它 我了解 NET 在字符串内部使用 UTF 16 这是正确的吗 然后 我通过

随机推荐

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

    我用过创建反应应用程序对于我的项目 我收到一个错误 未捕获的语法错误 意外的令牌导出 错误就在这段代码中 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