我们有一个通过 MQ 与外部通信的进程。外部系统在大型机(IBM z/OS)上运行,而我们在 CentOS Linux 平台上运行我们的进程。到目前为止,我们从未遇到任何问题。
最近,我们开始接收来自他们的消息,其中嵌入了不可打印的 EBCDIC 字符。他们使用字符作为压缩 ID,长度为 8 个字节。当我们收到它时,它会到达以 UTF (CCSID 1208) 编码的队列。
他们需要返回原始的 8 个字节才能识别我们的响应消息。我正在尝试在 Java 中找到一种解决方案,以便在发送响应之前将 ID 从 UTF 转换回 EBCDIC。
我一直在玩 JTOpen 库,使用 AS400Text 类进行转换。此外,交易对手已向我们发送了 ID 的快照(以字节为单位)。但是,当我比较转换后的字节时,它们与原始消息不同。
有没有人遇到过这个问题?也许我使用了错误的代码页?
感谢您提供的任何意见。
来自交易对手的字节(位置 [5,14]):
00000 F0 40 D9 F0 F3 F0 CB 56--EF 80 04 C9 10 2E C4 D4 |0 R030.....I..DM|
程序输出:
UTF String: [R030ôîÕ؜IDMDHP1027W 0510]
EBCDIC String: [R030ôîÃÃÂIDMDHP1027W 0510]
NATIVE CHARSET - HEX: [52303330C3B4C3AEC395C398C29C491006444D44485031303237572030353130]
CP500 CHARSET - HEX: [D9F0F3F066BE66AF663F663F623FC9102EC4D4C4C8D7F1F0F2F7E640F0F5F1F0]
这是一些示例代码:
private void readAndPrint(MQMessage mqMessage) throws IOException {
mqMessage.seek(150);
byte[] subStringBytes = new byte[32];
mqMessage.readFully(subStringBytes);
String msgId = toHexString(mqMessage.messageId).toUpperCase();
System.out.println("----------------------------------------------------------------");
System.out.println("MESSAGE_ID: " + msgId);
String hexString = toHexString(subStringBytes).toUpperCase();
String subStr = new String(subStringBytes);
System.out.println("NATIVE CHARSET - HEX: [" + hexString + "] [" + subStr + "]");
// Transform to EBCDIC
int codePageNumber = 37;
String codePage = "CP037";
AS400Text converter = new AS400Text(subStr.length(), codePageNumber);
byte[] bytesData = converter.toBytes(subStr);
String resultedEbcdicText = new String(bytesData, codePage);
String hexStringEbcdic = toHexString(bytesData).toUpperCase();
System.out.println("CP500 CHARSET - HEX: [" + hexStringEbcdic + "] [" + resultedEbcdicText + "]");
System.out.println("----------------------------------------------------------------");
}