将 sha1 摘要的一部分与 C 中的十六进制字符串进行比较
我有一个字符串,我计算 sha1 摘要如下:
SHA1(sn, snLength, sha1Bin);
如果我是正确的,这会产生一个 20 字节字符(带有二进制数据)。我想将此字符的最后 3 个字节与另一个字符进行比较。该字符包含字符串“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 新手,不理解它:-(
I have a string for which I compute a sha1 digest like this:
SHA1(sn, snLength, sha1Bin);
If I'm correct this results in a 20 byte char (with binary data). I want to compare the last 3 bytes of this char with another char. This char contains the string "6451E6". 64, 51 & E6 are hex values. How do I convert "6451E6" so that I can compare it via:
if(memcmp(&sha1Bin[(20 - 3)], theVarWithHexValues, 3) == 0)
{
}
I have this function:
/*
* 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);
}
which does the same but I'm new to C and don't understand it :-(
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
另一种方法更容易 - 将二进制数据转换为十六进制字符串进行比较:
即使您更喜欢转换为二进制,
sscanf(...%2x...)
也比手动解析更好十六进制数字。It's easier to go the other way — convert the binary data to a hex string for comparison:
Even if you prefer converting to binary,
sscanf(...%2x...)
is better than manually parsing hex numbers.修复 AShelly 的代码:
Fix for AShelly's code:
如果 theVarWithHexValues 确实是某种常量,那么最简单的方法就是直接将其转换为二进制形式。而不是:
使用:
...那么你可以直接使用
memcmp()
。If
theVarWithHexValues
is indeed a constant of some sort, then the easiest thing would be to put it into binary form directly. Instead of:use:
...then you can just
memcmp()
directly.