我认为我对字节数组和字符数组的理解导致了一些问题,这是我的问题:
我有一个应用程序从Websphere MQ中提取消息并将它们发送到目标系统。
MQ消息具有MQBYTE24(本质上是字节数组24),表示消息的MSGID。我的目标是将其转换为十六进制字符串。
在我的Linux机器上的WMQ资源管理器中,队列中的消息1具有消息标识符“AMQ QM01”(至少它看起来像它),并且下面的字节在资源管理器中显示:
00000 41 4D 51 20 51 4D 30 31--20 20 20 20 20 20 20 20 |AMQ QM01 |
00010 BD F4 A8 4E A2 A3 06 20-- |...N... |
现在,当我的代码运行时,我会选择相同的消息ID并尝试将其转换为十六进制字符串。
调试时的确切消息ID为:
AMQ QM01 \ 275 \ 364 \ 250N \ 242 \ 243 \ 006
在完成我的转换(下面的代码)后,我得到:
414D5120514D30312020202020202020FFFFFF4EFFFF6
正如您所看到的,它与WMQ Explorer显示的略有不同,任何想法我在这里做错了什么?
我认为是我从MQBYTE24转换为char ......那里出了问题......
下面是一个产生“错误结果”的小示例程序.....我支持我必须使用字节数组而不是char?
以下输出为:
结果:414D5120514D30312020202020202020FFFFFF4EFFFF6
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
char name[41]="AMQ QM01 \275\364\250N\242\243\006";
char buffer[82]="";
char *pbuffer = buffer;
FILE *fp_1;
FILE *fp_2;
int size;
char *buffer_1 = NULL;
char *buffer_2 = NULL;
int rc = convertStrToHex(buffer, name);
printf( "Result: %s\n", pbuffer );
}
return 0;
}
int convertStrToHex(char *buffer, char str[10]){
int len = strlen(str);
int i;
for( i = 0; i < len ;i++ ){
sprintf(buffer, "%X", str[i]);
buffer +=2;
};
}
感谢您的帮助: - )
林顿
答案 0 :(得分:2)
取决于编译器和平台,char是否已签名,printf的行为是不同的。
只需将str [i]强制转换为unsigned char(或更改函数原型中str的类型),它就可以了。例如(原型已更改):
int convertStrToHex(char *buffer, unsigned char str[10]){
int len = strlen(str);
int i;
for( i = 0; i < len ;i++ ){
sprintf(buffer, "%X", str[i]);
buffer +=2;
};
}
顺便说一句:如果没有分配长度并使用sprintf,则认为传递字符串是不安全的。您应该使用具有实际缓冲区长度的snprintf,或者至少在循环内处理大小限制。如果strlen(str)大于缓冲区的大小* 2。
答案 1 :(得分:1)
尝试
sprintf(buffer, "%X", (unsigned char)str[i]);
答案 2 :(得分:1)
正如其他几个答案已经指出的那样,你需要将字符转换为unsigned char
以避免用FF
填充它们以填充32位int的字节值。但实际上还有另一个问题:最后一个数字6
只会在输出中打印为一个字符。您希望每个角色恰好占据两个位置,因此您需要一个零填充字段说明符。总而言之,你得到了
sprintf(buffer, "%02X", (unsigned char)str[i]);