当打印字节数组数组在C中时处理隐秘输出



我最近遇到了我写的脚本的问题。

#include "md5.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
char* hashfunc (char* word1, char* word2){
    MD5_CTX md5;
    MD5_Init(&md5);
    char * word = (char *) malloc(strlen(word1)+ strlen(word2) );
    strcpy(word,word1);
    strcat(word,word2);
    MD5_Update(&md5,word,strlen(word));
    unsigned char* digest = malloc(sizeof(char)* 16); //MD5 generates 128bit hashes, each char has 4 bit, 128/4 = 32
    MD5_Final(digest,&md5);
    return digest;
}
int main(int argc, char* argv[]){
    char* a = argv[1];
    char* b = argv[2];
    unsigned char* ret = hashfunc(a,b);
    printf("%sn",ret);
    printf("%in",sizeof(ret));
}

当哈希函数返回一系列未签名的字符时,我以为我会按原样打印。
不幸的是,以下是我的输出:
..@.@a。%qw.0.
根据 sizeof()的说法,长度为8个字节。
如何将其转换为可读格式?

预先感谢!

ps:
输出应该看起来像这样:

1c0143c6ac7505c8866d10270a480dec

首先, sizeof指针将给出指向char的指针的大小,该指针是机器中单词的大小(我想它是64位,因为您的尺寸返回8(。指针不带有指针大小的信息,您必须在其他地方退还。

无论如何,由于您知道MD5 Digest具有16个字节,因此您可以在每个字节上迭代每个字节,并使用Sprintf以更可读的格式打印每个字节。这样的东西:

for (int i = 0; i < 16; i++)
    printf("%02x", (int)(unsigned char)digest[i]);
putchar('n');

如果要将其打印到文件,请将printf更改为fprintf,将putchar更改为fputc(该参数会更改一点(。

要将其放入字符串中,您必须将每个字节在字符串的正确位置中进行sprint,类似的内容:

char* str = malloc(33 * sizeof(char));
for (int i = 0; i < 16; i++)
    sprintf(str+2*i, "%02x", (int)(unsigned char)digest[i]);

P.S:不要忘记 free之后的所有内容。

无法保证您的hashfunc将产生可打印的ASCII字符串。从理论上讲,由于它们实际上只是二进制数据,因此它们可能嵌入0,这将搞砸所有正常的字符串处理功能。

最好的选择是通过for循环将每个未签名的炭打印为无符号字符。

void printhash(unsigned char* hash)
{
    for(int i = 0; i < 16; i++)
    {
        printf("%02x", hash[i]);
    }
    printf("n");
}

最新更新