-2

.so ライブラリをコンパイルし、新しいプロジェクトにコピーしました。ソースフォルダーから .h ファイルもコピーしました。

今、私はそれを使用しようとしています。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <iostream>
#include "md5.h"

using namespace std;

int main (int argc, char *argv[]) {
md5_init();
md5_append();
md5_finish();
return 0;
}

出力でエラーが発生しました: 関数 «void md5_init(md5_state_t*)» への引数が少なすぎます

そして .h ファイル:

typedef unsigned char md5_byte_t; /* 8-bit byte */
typedef unsigned int md5_word_t; /* 32-bit word */

/* Define the state of the MD5 Algorithm. */
typedef struct md5_state_s {
    md5_word_t count[2];    /* message length in bits, lsw first */
    md5_word_t abcd[4]; /* digest buffer */
    md5_byte_t buf[64]; /* accumulate block */
} md5_state_t;

#ifdef __cplusplus
extern "C"
{
#endif

/* Initialize the algorithm. */

#ifdef WIN32
_declspec(dllexport)
#endif
void md5_init(md5_state_t *pms);

/* Append a string to the message. */
#ifdef WIN32
_declspec(dllexport)
#endif
void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes);

/* Finish the message and return the digest. */
#ifdef WIN32
_declspec(dllexport)
#endif
void md5_finish(md5_state_t *pms, md5_byte_t digest[16]);

#ifdef __cplusplus
} /* end extern "C" */
#endif

図書館はこのサイトから入手しました。C++ の実装を参照してください。

私が誤解したことは何ですか?

4

1 に答える 1

1

呼び出しているすべての MD5 関数には、(少なくとも) 「メッセージ ダイジェスト ストリーム」(ダイジェストを生成する一連のバイト) の現在の状態を格納できる構造が必要です。

特定のストリームの状態は完全に構造体に格納されるため、この構造体を使用すると、複数の呼び出しの間に状態を格納したり、複数のストリームを並べmd5_append()て実行したりできます。

これを正しく行うには、次のようなものが必要です。

#define HELLO "Hello"
#define SENDR " from Pax"

int main (int argc, char *argv[]) {
    md5_state_t pms;
    md5_byte_t digest[16];

    md5_init (&pms);

    md5_append (&pms, (const md5_byte_t *)HELLO, strlen (HELLO));
    md5_append (&pms, (const md5_byte_t *)SENDR, strlen (SENDR));

    md5_finish (&pms, digest);

    // digest now holds the message digest for the given string.

    return 0;
}
于 2013-06-24T08:53:15.680 に答える