如何比较两个无符号字符数组?

3

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

服务器

unsigned char sum[MD5_DIGEST_LENGTH];
md5sum(tdata, sum);
w = write(newsockfd,sum,MD5_DIGEST_LENGTH);

客户端

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

输出结果完全相同,但怎样使用 if 语句来检查它们的相等性呢?如果我这样做:
if (sum == ssum)

它总是被评估为false。


3
一次一个字节。数组不能通过==进行比较,因为它只比较它们的第一个元素的地址(正如您所见,这是不同的 - 而且它们应该是不同的)。 - Jongware
2个回答

13

使用 memcmp 函数:

memcmp() 函数比较 s1 所指向对象的前 n 个字节(每个字节都被解释为无符号字符)和 s2 所指向对象的前 n 个字节。

如果在比较过程中两个对象的第一对不同字节(均被解释为无符号字符类型)的值不相等,则返回值的非零符号由它们之间的差异符号决定。


6
sumssum是数组,这意味着它们是指向一块内存的指针,当你写if (sum == ssum)时,你正在比较两个指针。因此,显然,你的输出总是false,因为不同内存块的指针不能相同。
因此,你需要通过其元素比较两个数组。你可以使用memcmp
bool isEqual = (memcmp(sum, ssum, MAX_DIGEST_LENGTH) == 0);

1
memcmp正是为这种用例而设计的,为什么要用自定义循环重新发明轮子呢? - Shea Levy
@SheaLevy 是的,而且memcmp比那个循环更快 - Chan Kha Vu
1
memcmp 的返回值不是布尔值。如果它返回 1 或 -1,这意味着第一个字节不匹配且分别小于或大于另一个值。如果它们相等,则返回 0。 - davidgyoung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接