【问题标题】:MD5 Transforming uint8_t to a stringMD5 将 uint8_t 转换为字符串
【发布时间】:2013-03-14 12:12:36
【问题描述】:

我正在使用维基百科上的 Md5 C 代码

int main(int argc, char **argv) {

if (argc < 2) {
    printf("usage: %s 'string'\n", argv[0]);
    return 1;
}

char *msg = argv[1];
size_t len = strlen(msg);

// benchmark
int i;
for (i = 0; i < 1000000; i++) {
    md5(msg, len);
}

//var char digest[16] := h0 append h1 append h2 append h3 //(Output is in little-endian)
uint8_t *p;

// display result

p=(uint8_t *)&h0;
printf("%2.2x%2.2x%2.2x%2.2x", p[0], p[1], p[2], p[3], h0);

p=(uint8_t *)&h1;
printf("%2.2x%2.2x%2.2x%2.2x", p[0], p[1], p[2], p[3], h1);

p=(uint8_t *)&h2;
printf("%2.2x%2.2x%2.2x%2.2x", p[0], p[1], p[2], p[3], h2);

p=(uint8_t *)&h3;
printf("%2.2x%2.2x%2.2x%2.2x", p[0], p[1], p[2], p[3], h3);
puts("");

return 0;

}

这就是代码。我已经了解了它的工作原理,我需要将 MD5 的结果转换为字符串。 这可能吗?

基本上我需要转换 p=(uint8_t *)&h0;它们中的每一个都连接到一个 char[] 并将它们连接起来,换句话说,将整个 MD5 代码放在一个 char[] 中。这是正确的/可能的吗?

昨天我花了一整天的时间来找到这个,我得到的最好的结果是如何使用 sprintft 转换 unit32_t,它确实有效。但对于 unit8_t 它没有。

【问题讨论】:

    标签: c md5


    【解决方案1】:

    每个 8 位数字应打印为%02x

    • 前导0表示数字将显示前导零
    • 2 表示宽度为两个十六进制字符
    • x 表示以十六进制打印数字。

    所以第一个实例是:

    p = (uint8_t *) &h0;
    printf("%02x%02x%02x%02x", p[0], p[1], p[2], p[3]);
    

    【讨论】:

    • 所以如果我做一个 sprintf(buffer, "%02x%02x%02x%02x", p),它可以工作吗?
    • 问题:缓冲区应该有多大,以便 8 位可以复制到它?
    • 这个官方版本是使用PRIx8宏来打印uint8_t。类似printf("%" PRIx8, p[0])
    猜你喜欢
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 2011-11-29
    相关资源
    最近更新 更多