2017-08-17 141 views
2

我正在使用IBM的mq库从MQ队列中读取消息。现在我需要检索消息的messageid。我现在是在名称messageId下的消息头中。但是这返回一个字节[]。现在我需要将其更改为可读的字符串。以字符串格式获取MQ messageId

如何将messageId从byte []转换为字符串?

我尝试了几个转换,但他们的作品非:

new String(theMessage.messageId) 
new String(theMessage.messageId, "UTF-8") 
new String(theMessage.messageId, "UTF-16") 
theMessage.messageId.toString() 

回答

2

在MQMD的messageId被表示为24个字节。如果您知道生成的平台是什么,那么您可以通过将字节转换为队列管理器字符集中的字符集来查找它们的某些部分,但不建议依赖传输的任何数据在messageID中作为字符数据,因为我看到IBM的语句类似于“MsgId is generated by MQ in an IBM proprietary format and it may change at any time.

如果要将它们表示为字符串,则应将它们表示为48个字符的HEX字符串,表示24个字节。

下面是一个示例函数getHexString IBM在Technote中提供了一个将为您执行此转换的示例函数。你会使用这样的:

getHexString(theMessage.messageId) 

下面的示例函数是IBM MQ技术说明 “How to match correlation id's when request is made via JMS application and reply generated from base Java API

public static String getHexString(byte[] b) throws Exception { 
    String result = ""; 
    for (int i=0; i < b.length; i++) { 
     result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1); 
    } 
    return result; 
} 
1

的MQMD MessageID字段由字符和二进制值。因此,正确地将MessageId字段表示为String的唯一方法是将其转换为HEX表示。

你需要用我的bytesToHex方法:

String s = bytesToHex(theMessage.messageId); 

因此,S看起来像 '414D51204D5141312020202020202020134CCD4020000B01'。

而对于bytesToHex方法的Java代码是:

public static final String HEX_CHARS = "ABCDEF"; 

public static String bytesToHex(byte[] data) 
{ 
    StringBuffer buf = new StringBuffer(); 
    for (int i = 0; i < data.length; i++) 
     buf.append(byteToHex(data[i])); 

    return buf.toString(); 
} 

public static String byteToHex(byte data) 
{ 
    int hi = (data & 0xF0) >> 4; 
    int lo = (data & 0x0F); 
    return "" + HEX_CHARS.charAt(hi) + HEX_CHARS.charAt(lo); 
}