2017-08-17 57 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); 
}