为什么我的MD5值打印时带有额外的"f"字符?

pej*_*otr 3 c++ md5 stdstring

当使用std :: string的at()方法时,我有一个奇怪的问题.我想使用这个库计算给定字符串的md5哈希值:http://sourceforge.net/projects/libmd5-rfc/files/ 正确计算哈希值,但是以人工方式打印时出现问题.输出是:

af04084897ebbf299b04082d105ab724
ffffffaf040848ffffff97ffffffebffffffbf29ffffff9b04082d105affffffb724
Run Code Online (Sandbox Code Playgroud)

代码是:

  #include <stdio.h>
  #include<string>
  #include<iostream>

  extern "C" {
      #include "md5.h"
  }

  int main()
  {
      md5_state_t state;
      md5_byte_t digest[16];

      std::string callid("f83bc385-26da-df11-95d5-0800275903dd@pc-archdev");

      md5_init(&state);
      md5_append(&state, (const md5_byte_t*)callid.c_str(), callid.length());

      std::string callid_digest((const char*)digest, 16);

      for(int i = 0; i < 16; ++i) {
          printf("%02x", digest[i]);
      }

      printf("\n");

      for(int i = 0; i < 16; ++i) {
          const char c = callid_digest.at(i);
          printf("%02x", c);
      }

      printf("\n");
  }
Run Code Online (Sandbox Code Playgroud)

"f"字符来自哪里?

pax*_*blo 8

您的字节值正在进行符号扩展.

当您将(签名)字符提升为更宽的类型并设置最高位时会发生这种情况,因为它会尝试保留符号(这就是为什么您f只看到大于的值的额外字符0x7f).使用an unsigned char应该解决问题:

const unsigned char c = callid_digest.at(i); // may need to cast.
Run Code Online (Sandbox Code Playgroud)