Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取字符串格式的MQ messageId_Java_Ibm Mq - Fatal编程技术网

Java 获取字符串格式的MQ messageId

Java 获取字符串格式的MQ messageId,java,ibm-mq,Java,Ibm Mq,我正在使用IBM的mq库从mq队列读取消息。现在我需要检索消息的messageid。我现在知道它在消息头中的名称messageId下。但这将返回一个字节[]。现在我需要将其更改为可读字符串 如何将messageId从字节[]转换为字符串 我尝试了几次转换,但没有一次成功: new String(theMessage.messageId) new String(theMessage.messageId, "UTF-8") new String(theMessage.messageId, "UTF-

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

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

我尝试了几次转换,但没有一次成功:

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

MQMD MessageId字段由字符值和二进制值组成。因此,将MessageId字段正确表示为字符串的唯一方法是将其转换为十六进制表示

您需要使用我的bytesToHex方法:

String s = bytesToHex(theMessage.messageId);
因此,s看起来像“414D51204D51413120202020202020134CD4020000B01”

bytesToHex方法的Java代码是:

public static final String HEX_CHARS = "0123456789ABCDEF";

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);
}
公共静态最终字符串HEX_CHARS=“0123456789ABCDEF”; 公共静态字符串bytesToHex(字节[]数据) { StringBuffer buf=新的StringBuffer(); 对于(int i=0;i>4; int lo=(数据&0x0F); 返回“+”十六进制字符(hi)+十六进制字符(lo); }
更新日期:2020年7月23日

以下是将十六进制字符串转换为字节数组的方法:

public static byte[] hexStringToByteArray(String inString)
{
   byte[] outBuffer = new byte[inString.length()/2];
   String hex;
   int xx;

   for (int i=0, j=0; j < (inString.length() - 1); i++, j+=2)
   {
      hex = inString.substring(j,j+2);
      xx = Integer.parseInt(hex.trim(), 16);
      if (xx < 0)
         xx += 256;

      outBuffer[i] = (byte)xx;
   }

   return outBuffer;
}
公共静态字节[]hexStringToByteArray(字符串指令)
{
byte[]exputffer=新字节[inString.length()/2];
字符串十六进制;
int xx;
对于(int i=0,j=0;j<(inString.length()-1);i++,j+=2)
{
十六进制=安装子串(j,j+2);
xx=Integer.parseInt(hex.trim(),16);
if(xx<0)
xx+=256;
exputffer[i]=(字节)xx;
}
返回爆发器;
}

MQMD中的messageId表示为24个字节。如果您知道这些数据是在什么平台上生成的,那么您可能能够通过将字节转换为队列管理器字符集中的字符来发现它们的某些部分的意义,这些字节是在队列管理器的字符集中生成的,但不建议依赖messageID中作为字符数据传输的任何数据,因为我已经看到IBM的语句类似于“MsgId由MQ以IBM专有格式生成,它可能随时更改。”

如果要将它们表示为字符串,则应将它们表示为48个字符的十六进制字符串,表示24个字节

下面是IBM在技术说明中提供的示例函数
getHexString
IBM将为您执行此转换。您可以这样使用它:

getHexString(theMessage.messageId)

下面的示例函数来自IBM MQ Technote“”

公共静态字符串getHexString(字节[]b)引发异常{
字符串结果=”;
for(int i=0;i

IBM在“知识中心”页面底部记录队列管理器生成的消息ID的格式和唯一性“”

队列管理器生成的MsgId由一个4字节的产品标识符(ASCII或EBCDIC中的AMQ或CSQ,其中¨表示空白字符)组成,后跟一个唯一字符串的特定于产品的实现。在IBM®MQ中,它包含队列管理器名称的前12个字符,以及从系统时钟派生的值。因此,所有可以相互通信的队列管理器的名称必须在前12个字符中有所不同,以确保消息标识符是唯一的。生成唯一字符串的能力还取决于没有向后更改的系统时钟。为了消除队列管理器生成的消息标识符与应用程序生成的消息标识符重复的可能性,应用程序必须避免在ASCII或EBCDIC(X'41'到X'49'和X'C1'到X'C9')中生成初始字符在a到I范围内的标识符。但是,不会阻止应用程序生成初始字符在这些范围内的标识符


我已经成功地实现了获取MQ MessageId并将其转换为十六进制字符串以用于本地存储,然后在稍后使用它再次查询MQ时将其转换回字节[]的循环,因此:

我喜欢这种方法,因为它依赖于一个知名和受人尊敬的组织提供的维护良好的库,我不需要维护任何其他方法


尽管如此,我还是想感谢Roger的上述评论,因为他们让我走上了通向Apache Commons编解码器的道路。

如果我将messageId发送回MQ以定位消息,是否需要将其从十六进制转换回字节?是的。MessageId是一个24字节的字段。谢谢你,罗杰!您熟悉这里提到的Apache Codec类吗:我正在考虑使用Codec类在两端进行翻译。对不起。我没有使用Apache编解码器。我更新了我的答案以包含hextStringToByteArray()方法。
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;
}
import org.apache.commons.codec.binary.Hex;

String mqMessageId = Hex.encodeHexString(message.messageId);
message.messageId = Hex.decodeHex(mqMessageId.toCharArray());