3

std :: stringのat()メソッドを使用すると奇妙な問題が発生します。このライブラリを使用して、指定された文字列のmd5ハッシュを計算したいと思います。http://sourceforge.net/projects/libmd5-rfc/files/ ハッシュは正しく計算されますが、人間の方法で印刷することに問題があります。出力は次のとおりです。

af04084897ebbf299b04082d105ab724
ffffffaf040848ffffff97ffffffebffffffbf29ffffff9b04082d105affffffb724

コードは次のとおりです。

  #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");
  }

「f」の文字はどこから来たのですか?

4

1 に答える 1

8

バイト値は符号拡張されています。

これは、(符号付き)文字をより広い型にプロモートし、最上位ビットが設定されている場合に発生します。これは、符号を保持しようとするためです(これが、fより大きい値に対してのみ余分な文字が表示される理由です0x7f)。を使用するunsigned charと、問題が解決するはずです。

const unsigned char c = callid_digest.at(i); // may need to cast.
于 2010-10-20T17:58:33.960 に答える