我有一个字符串,我可以像这样计算sha1摘要:
SHA1(sn, snLength, sha1Bin);
如果我是正确的,则会产生20字节的字符(带有二进制数据)。我想比较这个char的最后3个字节与另一个char。此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的新手并且不理解: - (
答案 0 :(得分:3)
更容易走另一条路 - 将二进制数据转换为十六进制字符串进行比较:
char suffix[7];
sprintf(suffix, "%02x%02x%02x", sha1Bin[17], sha1Bin[18], sha1Bin[19]);
return stricmp(suffix, theVarWithHexValues) == 0;
即使您更喜欢转换为二进制,sscanf(...%2x...)
也比手动解析十六进制数更好。
答案 1 :(得分:1)
修复AShelly的代码:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int hashequal(const unsigned char *sha1Bin, const char *hexstr) {
unsigned long hexvar = strtoul(hexstr, NULL, 16);
unsigned char theVarWithHexValues[] = { hexvar >> 16, hexvar >> 8, hexvar };
return memcmp(sha1Bin + 17, theVarWithHexValues, 3) == 0;
}
int main() {
unsigned char sha1Bin[20];
sha1Bin[17] = 0x64;
sha1Bin[18] = 0x51;
sha1Bin[19] = 0xE6;
printf("%d\n", hashequal(sha1Bin, "6451E6"));
printf("%d\n", hashequal(sha1Bin, "6451E7"));
}
答案 2 :(得分:1)
如果theVarWithHexValues
确实是某种常量,那么最简单的方法就是将其直接放入二进制形式。而不是:
const char *theVarWithHexValues = "6451E6";
使用:
const char *theVarWithHexValues = "\x64\x51\xE6";
...然后你可以直接memcmp()
。
答案 3 :(得分:0)
char* hexstr = "6451E6";
unsigned long hexvar = strtoul(hexstr, NULL, 16);
hexvar = htonl(hexvar)<<8; //convert to big-endian and get rid of zero byte.
memcmp(&sha1Bin[(20 - 3)], (char*)hexvar, 3)