2017-08-17 16 views
2

私はMQキューからメッセージを読むためにIBMのmqライブラリを使用しています。メッセージのメッセージIDを取得する必要があります。私は今messageIdという名前のメッセージヘッダーにあります。しかし、これはバイト[]を返します。今私はそれを可読な文字列に変更する必要があります。MQメッセージIDを文字列形式で取得

messageIdをbyte []からstringに変換するにはどうすればよいですか?

私は変換のカップルを試みたが、それらの非作品:

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

答えて

2

MQMD内のmessageIdが24バイトで表されます。これらが生成されたプラットフォームが分かっている場合は、キューマネージャーの文字セット内のバイトを文字に変換することで、一部の意味を見つけることができるかもしれませんが、運ばれるデータには依存しないことをお勧めしませんIBMからの文が "MsgId is generated by MQ in an IBM proprietary format and it may change at any time."と似ているので、messageIDには文字データとして表示されています。

文字列として表現する場合は、24バイトを表す48文字のHEX文字列で表す必要があります。

以下は、この変換を実行するTechnoteでIBMが提供したサンプル関数getHexStringです。以下のサンプル関数は、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; 
} 

getHexString(theMessage.messageId) 

:あなたはこのようにそれを使用します

1

MQMDメッセージIdフィールドは文字とバイナリ値の両方で構成されています。したがって、MessageIdフィールドをStringとして正しく表現する唯一の方法は、それをHEX表現に変換することです。

String s = bytesToHex(theMessage.messageId); 

したがって、s 'は414D51204D5141312020202020202020134CCD4020000B01' のようになります:

は、あなたは私のbytesToHexメソッドを使用する必要があります。

そして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); 
} 
関連する問題