将 sha1 摘要的一部分与 C 中的十六进制字符串进行比较

标签 c hex sha1

我有一个字符串,我会像这样计算一个 sha1 摘要:

SHA1(sn, snLength, sha1Bin);

如果我是正确的,这会产生一个 20 字节的字符(带有二进制数据)。我想将这个 char 的最后 3 个字节与另一个 char 进行比较。此字符包含字符串“6451E6”。 64、51 和 E6 是十六进制值。如何转换“6451E6”以便我可以通过以下方式比较它:

if(memcmp(&sha1Bin[(20 - 3)], theVarWithHexValues, 3) == 0)

{

}

我有这个功能:

/*
 * convert hexadecimal ssid string to binary
 * return 0 on error or binary length of string
 *
 */
u32 str2ssid(u8 ssid[],u8 *str) {
    u8 *p,*q = ssid;
    u32 len = strlen(str);

    if( (len % 2) || (len > MAX_SSID_OCTETS) )
      return(0);

    for(p = str;(*p = toupper(*p)) && (strchr(hexTable,*p)) != 0;) {

      if(--len % 2) {
        *q = ((u8*)strchr(hexTable,*p++) - hexTable);
        *q <<= 4;
      } else {
        *q++ |= ((u8*)strchr(hexTable,*p++) - hexTable);
      }
    }
    return( (len) ? 0 : (p - str) / 2);
}

它的作用相同,但我是 C 的新手,不理解它:-(

最佳答案

换一种方式更容易——将二进制数据转换为十六进制字符串进行比较:

char suffix[7];
sprintf(suffix, "%02x%02x%02x", sha1Bin[17], sha1Bin[18], sha1Bin[19]);
return stricmp(suffix, theVarWithHexValues) == 0;

即使您更喜欢转换为二进制,sscanf(...%2x...) 也比手动解析十六进制数要好。

关于将 sha1 摘要的一部分与 C 中的十六进制字符串进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4381694/

相关文章:

c - 具有数组和指针的结构

php - 这是什么类型的哈希/加密? '0E0B020601'

c++ - 如何在 C++ 中读取由空格分隔的十六进制字节数据

Java BigDecimal 行为

php - 使用 PHP 在登录表单中使用 sha1 加盐密码?

c++ - 为什么需要 sleep(1) 来让 socket 耗尽?

c - 为什么 strsep() 不适用于指向堆栈的指针?

c - C 中的后递增运算符

java - 十六进制到整数(4 字节)

git - 新发现的 SHA-1 冲突如何影响 Git?