将字节数组/字符数组转换为C中的十六进制字符串

时间:2011-10-28 11:39:02

标签: c

我认为我对字节数组和字符数组的理解导致了一些问题,这是我的问题:

我有一个应用程序从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;
    };
}

感谢您的帮助: - )

林顿

3 个答案:

答案 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]);