【发布时间】:2020-08-23 07:01:58
【问题描述】:
我正在尝试从一个应用程序获取数据并在处理数据后将其发送到另一个(大型机)。
假设我正在获取“这是来自另一个应用程序”的数据,处理与“此数据已处理”相同的处理状态。最终消息应结合使用编码(Cp1047)到大型机应用程序读取相同
0024这是来自另一个应用程序001A此数据已处理
0024 的十进制值为 36(消息长度 + 4 是十六进制值长度)
001A 的十进制值为 26(处理后的消息长度 + 4)
我的应用程序在 Java8 上运行并使用 websphere MQ。我需要将数据发送到从 Mainframe MQ 接收数据的应用程序。 WebSphere MQ 中的远程队列将消息放入大型机 MQ 的本地队列。我的代码如下,使用 Cp1047 转换数据和编码,
String incomingData = "This is from another application";
String processingData = "This data is processed"
public String outGoingData(String incomingData, String processingData) {
StringBuilder strBuilder = new StringBuilder();
return stringbuilder.append(new String(convertToEbcidie(incomingData, "Cp1047")))
.append(incomingData)
.append(new String(convertToEbcidie(processingData, "Cp1047")))
.append(processing data).toString(); //playing this string to queue
}
private byte[] convertToEbcidic(String s) {
String hexStr = StringUtils.leftPad(s.length+4, 8, "0");
byte[] byteAry = new byte[hexStr.length()/2];
for (int i = 0; i < hexStr.length(); i+=2) {
byteAry[i/2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i+1), 16));
} return byteAry;
}
接收方应用程序(大型机)决定哪个是原始消息和基于处理状态的 4 个字符的十六进制值。 他们能够阅读大部分信息,但不是全部。例如,长度为 805 的十六进制值为 325,但在大型机 mq 条目中为 315。由于长度不匹配,它们无法处理。
另一个示例数据:- OO25这是来自来源001A已成功处理的原始数据
0025 是 org msg 长度 (33) + 4 的十六进制值,001A 是处理后的 msg 长度 (22) + 4 的十六进制值。这里 4 是十六进制值的长度。
我是否缺少任何转换为 ebcidic 的逻辑?
【问题讨论】:
-
这能回答你的问题吗? ASCII to EBCDIC conversion in Java
-
这个问题的格式看起来比第一个问题好得多,但是您不应该打开一个新的重复问题,因为您的旧问题已关闭,您应该编辑已关闭的问题并添加这些详细信息。
-
您的代码页翻译正在将长度字段转换为文本的一部分,因此 0x03 映射到 EBCDIC 中的相同值,但 0x25(换行)映射到 EBCDIC 中的 0x15(新行) .
-
有什么办法可以防止0x25转换成0x15。随机六进制值会发生这种情况,并且由于此大型机应用程序无法读取更多消息。我尝试了许多编码选项,例如“Cp1047”,但没有取得多大成功。
-
在将传入消息转换为 EBCDIC 时可以跳过长度字段吗?
标签: java ibm-mq encode mainframe character-set