C 字节数组到十六进制字符串转换的最佳方式?(避免滑稽角色)

C 字节数组到十六进制字符串转换的最佳方式?(避免滑稽角色),c,C,我有一个应用程序,它需要从Websphere MQ消息中获取MsgId,并将其作为文件名写入文件系统……但有十六进制值字符串 请注意,WebSphereMQ上的MsgId实际上是一个长度为24的字节数组,我认为这就是我的问题所在 下面是一些代码片段: #define MSGID_LEN 24 #define MSGID_HEX_LEN 48 ... ... char *uuid = NULL; char *buffer = NULL; char msgid_hex[M

我有一个应用程序,它需要从Websphere MQ消息中获取MsgId,并将其作为文件名写入文件系统……但有十六进制值字符串

请注意,WebSphereMQ上的MsgId实际上是一个长度为24的字节数组,我认为这就是我的问题所在

下面是一些代码片段:

 #define MSGID_LEN 24
 #define MSGID_HEX_LEN 48

    ...
    ...
 char *uuid = NULL;
 char *buffer = NULL;
 char msgid_hex[MSGID_HEX_LEN];
 char *pmsgid_hex = msgid_hex;
 char msgid[MSGID_LEN];

 memcpy(msgid, md.MsgId, MSGID_LEN);
 convertMsgIdToHex(pmsgid_hex, msgid);
 uuid = malloc(MSGID_HEX_LEN * sizeof(char));
 memcpy(uuid, pmsgid_hex, MSGID_HEX_LEN);

    ..
    ..

    int convertMsgIdToHex(char *msgid_hex, char msgid[MSGID_LEN]){
        int len = strlen(msgid);
        int i;

        for(i=0; i<len;i++){
            sprintf(msgid_hex, "%02X", (unsigned char)msgid[i]);
            msgid_hex +=2;
        };
    }
#定义MSGID#LEN 24
#定义MSGID_HEX_LEN 48
...
...
char*uuid=NULL;
char*buffer=NULL;
字符msgid_hex[msgid_hex_LEN];
char*pmsgid_hex=msgid_hex;
char msgid[msgid_LEN];
memcpy(msgid,md.msgid,msgid_LEN);
convertMsgIdToHex(pmsgid_hex,msgid);
uuid=malloc(MSGID_HEX_LEN*sizeof(char));
memcpy(uuid、pmsgid_hex、MSGID_hex_LEN);
..
..
int convertMsgIdToHex(char*msgid_hex,char msgid[msgid_LEN]){
int len=strlen(msgid);
int i;

对于(i=0;i您不应使用
strlen
来确定消息长度:
strlen
应仅用于以null结尾的字符串。由于此处的消息采用二进制编码,因此可能包含嵌入的零(这将导致消息被截断)或者它可能不包含零-这将导致缓冲区溢出,因为您将读取超过消息末尾

因为这里的消息长度显然是
MSGID_LEN
,所以应该使用它作为长度


此外,您需要确保输出缓冲区足够大。其大小应至少为
2*MSGID_LEN+1
:每个输入字节2个字符,加上一个空终止符。

%02X
可以将字符转换为十六进制。如果出现错误,我建议您查找缓冲区溢出或类似情况。Y您至少应该检查输入字符串的长度,以确保它不超过缓冲区长度减去1的一半。(减去1是因为您需要在缓冲区末尾写入null,因此需要为此保留额外字符。)字节数组不是字符串。您需要去掉strlen()在这段代码中。没问题,您知道长度。如何从字节数组生成文件名还不清楚,使用十六进制编码字符串应该可以很好地工作,因为它只包含[0-9A-F]谢谢您的评论,非常感谢:-)