我如何比较2个unsigned char数组?

Cli*_*nes 1 c hash

我有一台服务器计算图像的散列并将图像和散列发送到客户端.我让客户端计算它接收的图像的哈希值.这是基本设置:

服务器

unsigned char sum[MD5_DIGEST_LENGTH];
md5sum(tdata, sum);
w = write(newsockfd,sum,MD5_DIGEST_LENGTH);
Run Code Online (Sandbox Code Playgroud)

客户

unsigned char ssum[MD5_DIGEST_LENGTH];
w = read(sockfd,ssum,MD5_DIGEST_LENGTH);
unsigned char sum[MD5_DIGEST_LENGTH];
md5sum(imgpath, sum);
int j;
for (j = 0; j < MD5_DIGEST_LENGTH; j++)
    printf("%02x", ssum[j]);
printf("\n");
printf("CLIENT CHECKSUM: ", sum);
    for (j = 0; j < MD5_DIGEST_LENGTH; j++)
        printf("%02x", sum[j]);
printf("\n");
Run Code Online (Sandbox Code Playgroud)

输出完全相同,但如何使用if语句检查它们的相等性?如果我做:

if (sum == ssum)
Run Code Online (Sandbox Code Playgroud)

它总是评估为假.

She*_*evy 9

使用memcmp:

memcmp()函数应将s1指向的对象的前n个字节(每个解释为unsigned char)与s2指向的对象的前n个字节进行比较.

非零返回值的符号应由所比较的对象中不同的第一对字节(均被解释为类型无符号字符)的值之间的差异的符号确定.


Fal*_*nUA 5

sum并且ssum是数组,这意味着它们是指向内存块的指针,因此在编写时if (sum == ssum),您正在比较两个指针。显然,这就是为什么您的输出始终为false的原因,因为指向不同内存块的指针不能相同。

因此,您需要按其元素比较两个数组。您可以使用memcmp

bool isEqual = (memcmp(sum, ssum, MAX_DIGEST_LENGTH) == 0);
Run Code Online (Sandbox Code Playgroud)