gpt4 book ai didi

java - UTF 到 EBCDIC 的转换是无损的吗?

转载 作者:行者123 更新时间:2023-11-30 11:32:33 25 4
gpt4 key购买 nike

我们有一个通过 MQ 与外部通信的进程。外部系统在大型机 maching (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("----------------------------------------------------------------");
}

最佳答案

如果 MQ 消息具有需要不同编码的不同子消息字段,那么您应该以这种方式处理这些消息,即,作为单独的消息片段。

但是正如您所描述的那样,需要在不进行转换的情况下接收整个消息。需要提取前八个字节并单独保存。然后可以对消息的其余部分进行编码转换(除非其他子字段也需要提取为二进制、未转换的字节)。

对于任何返回消息,都必须进行相反的转换。可以转换消息的文本部分,然后该子字符串可以在其前面加上原始的八个字节。新重构的消息然后可以通过队列发回,同样不需要自动转换。

另一端的合作伙伴未正确使用消息传递产品。 (当然,您可能不应该大声说出来。)此类消息的任何部分都不应无法自动在两个方向上完好无损地保存下来。对于一个示例方法,它应该表示为更像是 8 字节值的 16 字节十六进制表示,而不是 8 字节的二进制字段。在十六进制中,无论哪种方式都不会出现转换问题。

关于java - UTF 到 EBCDIC 的转换是无损的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16614433/

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