我正在尝试使用md5代码来计算文件的校验和。现在给定的函数在屏幕上打印出(先前计算的)校验和,但是我想将它存储在一个变量中,以便以后能够比较它。
我想主要问题是我想将数组的内容存储在一个变量中。 我该如何管理? 可能这是一个非常愚蠢的问题,但也许somone可以提供帮助。
以下是打印出值的功能。我想修改它以将结果存储在一个变量中。
static void MDPrint (MD5_CTX* mdContext)
{
int i;
for (i = 0; i < 16; i++)
{
printf ("%02x", mdContext->digest[i]);
} // end of for
} // end of function
出于完整性的原因,使用了结构:
/* typedef a 32 bit type */
typedef unsigned long int UINT4;
/* Data structure for MD5 (Message Digest) computation */
typedef struct {
UINT4 i[2]; /* number of _bits_ handled mod 2^64 */
UINT4 buf[4]; /* scratch buffer */
unsigned char in[64]; /* input buffer */
unsigned char digest[16]; /* actual digest after MD5Final call */
} MD5_CTX;
和用于计算校验和的函数:
static int MDFile (char* filename)
{
FILE *inFile = fopen (filename, "rb");
MD5_CTX mdContext;
int bytes;
unsigned char data[1024];
if (inFile == NULL) {
printf ("%s can't be opened.\n", filename);
return -1;
} // end of if
MD5Init (&mdContext);
while ((bytes = fread (data, 1, 1024, inFile)) != 0)
MD5Update (&mdContext, data, bytes);
MD5Final (&mdContext);
MDPrint (&mdContext);
printf (" %s\n", filename);
fclose (inFile);
return 0;
}
答案 0 :(得分:4)
声明一个数组并memcpy结果。
示例:
unsigned char old_md5_dig[16]; // <-- binary format
...
MD5_CTX mdContext;
MD5Init(&mdContext);
MD5Update(&mdContext, data, bytes);
MD5Final(&mdContext);
memcpy(old_md5_dig, mdContext.digest, 16); // <--
编辑:要将前一个与新的md5哈希进行比较,您可以使用memcmp,
if (memcmp(old_md5_dig, mdContext.digest, 16)) {
// different hashes
}
答案 1 :(得分:1)
您可以定义变量:
char **md5sums;
然后,您需要修改MDPrint,而不是返回带有32位十六进制数字的malloced以null结尾的字符串。您基本上可以重复使用现有循环,但需要使用sprintf
。
然后主要将md5sum(char *)添加到md5sums。您需要使用realloc为md5sums分配内存,因为您事先不知道元素的数量。
应该是:
static char* MDString (mdContext)
MD5_CTX *mdContext;
{
int i;
char *digest = malloc(sizeof(char) * 33);
if(digest == NULL)
{
return NULL;
}
for (i = 0; i < 16; i++)
{
sprintf(digest + (i * 2), "%02x", mdContext->digest[i]);
}
return digest;
}
此外,您应该通过编辑问题来修改代码。你为什么使用K&amp; R语法?
编辑:我修正了一些错误的计数。答案 2 :(得分:1)
只需将char缓冲区及其大小传递给此函数:
static void MDGen (mdContext, buf, size)
MD5_CTX *mdContext;
char *buf;
size_t size;
{
int i;
int minSize = 33; // 16 pairs of hex digits plus terminator
if ((buf != NULL) && (size >= minSize))
{
memset(buf, 0, size);
for (i = 0; i < 16; i++)
{
snprintf(buf + (i*2), size - (i*2), "%02x", mdContext->digest[i]);
}
}
}
答案 3 :(得分:1)
由于您想要复制,存储,比较,释放和可能更多的MD5摘要,只需创建一个md5_t
类型并编写适当的函数来操作它,即:
typedef char md5_t[16];
md5_t *md5_new( MD5_CTX *pMD5Context )
{
md5_t *pMD5 = malloc( sizeof( md5_t ) );
memcpy( pMD5, pMD5Context->digest, 16 );
return pMD5 ;
}
int md5_cmp( md5_t *pMD5A, md5_t *pMD5B )
{
return memcmp( pMD5A, pMD5B, 16 );
}
void md5_print( md5_t *pMD5 )
{
...
}
void md5_free( md5_t *pMD5 )
{
free( pMD5 );
}
依此类推......接下来,为MD5数组创建一个类型,并使用简单的函数来操作它:
typedef struct md5array_t {
unsigned int uSize ;
md5_t **ppMD5 ;
}
md5array_t *md5array_new()
{
md5array_t *pArray = malloc( sizeof( md5array_t );
pArray->uSize = 0 ;
pArray->ppMD5 = NULL ;
}
md5array_t *md5array_add( md5array_t *pArray, md5_t *pMD5 )
{
pArray->uSize ++ ;
pArray = realloc( pArray, pArray->uSize + sizeof( md5_t * ) );
pArray->ppMD5[ pArray->uSize-1 ] = pMD5 ;
}
md5_t *md5array_get( md5array_t *pArray, unsigned int uIndex )
{
return pArray->ppMD5[ uIndex ];
}
void md5array_free( md5array_t *pArray }
{
/* I let you find what to write here.
Be sure to read AND understand the previous
functions. */
}
要恢复:只要您想要使用基准进行多项操作,请创建一个类型以及操作它所需的功能。您不需要创建一个真实的泛型类型,其中包含完整的函数,表示您可以在该类型上设想的许多操作:只需编写您需要的代码。例如,在md5array_t中,您可以添加md5_t *
但不能删除它(除非您编写函数void md5array_del( md5array_t *pArray *, int iIndex )
。
P.S。 :我的C代码在这里“说明”我的观点,不能仅仅通过复制/粘贴它来使用......
答案 4 :(得分:0)
将其存储为字符串,然后使用strcmp()进行比较。
答案 5 :(得分:0)
留下一个阵列! 你没有把它存储在变量中;因为它在变量中是ALREADY .. 只需创建全局变量,在其中存储MD5哈希并稍后与之进行比较。
你需要的是MD5IsEqual函数,它需要2个这样的数组。
int MD5IsEqual(unsigned char *x, unsigned char* y)
{
int i;
for(i=0; i<16;i++)
if(x[i] != y[i])
return 0;
return 1;
}
答案 6 :(得分:0)
为什么不制作功能
MD5File(char * filename,unsigned char * digest){
像以前一样> * * memcpy(digest,mdContext-&gt; digest,16); 返回;}
这样在功能之外你可以访问摘要(打印后)?
摘要只是一个包含16个无符号字符的数组......
答案 7 :(得分:0)
您知道按照打印方式存储总和的位置:通过 - &gt;摘要[i]。其定义如
unsigned char digest[16];
所以你基本上只需要在另一个unsigned char数组中复制这16个unsigned char(至少16个unsigned char long)。 memcpy函数可以做到这一点。如果您需要比较两个总和,则可以使用memcmp
(比较大小为16*sizeof(unsigned char)
,即16,即sizeof(unsigned char)1。