2011-10-28 125 views
3

我想我的字节数组和字符数组的理解导致了我一些问题,这里是我的问题:转换字节数组/字符数组到十六进制字符串用C

我有拉从WebSphere MQ和消息应用程序将它们发送到目标系统。

MQ消息具有表示消息的MSGID的MQBYTE24(基本上是字节数组24)。我的目标是将其转换为十六进制字符串。

在队列中的在我的Linux框消息1的WMQ探险有“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资源管理器显示,任何IDE略有不同我在这里做错了什么?

我想这是我从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

是那里的转义序列? C sprintf如何处理它们?另外,为什么char * pbuffer = buffer?只需在printf中使用'buffer'... –

+0

@AaronGage:它们是八进制字符。 –

+0

你真的应该在调用之前为'convertStrToHex'指定一个原型。将定义(它本身就是一个原型)移动到'main'之前或者在包含之后添加纯原型:'int convertStrToHex(char *,char *);' – pmg

回答

0

正如一些其他的答案已经指出的,你需要的字符转换为unsigned char避免其被用FF填补填补字节的32位int的价值。但实际上还有另外一个问题:最后的唯一编号6只会在输出中打印为一个字符。你希望每个字符占据两个位置,所以你需要一个零填充字段说明符。把它放在一起,你得到

sprintf(buffer, "%02X", (unsigned char)str[i]); 
+0

感谢大家,你真的帮了很多! –

1

取决于编译器和平台的炭签署否则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的情况下。

0

尝试

sprintf(buffer, "%X", (unsigned char)str[i]); 
相关问题