将数组的值存储在一个变量中

时间:2010-06-02 11:41:34

标签: c arrays variables md5

我正在尝试使用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;
}

8 个答案:

答案 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。