Разбираю код для проекта cpu-miner. Существует функция с именем hex2bin, которая преобразует шестнадцатеричные строки в двоичные длинные числа. Я сам пробовал эту функцию, но каждый раз получал разные выходные данные одного и того же входа. Почему это происходит и почему они просто не используют strtol (hexstring, 0, 16)?
Это функция hex2bin:
bool hex2bin(unsigned char *p, const char *hexstr, size_t len)
{
char hex_byte[3];
char *ep;
hex_byte[2] = '\0';
while (*hexstr && len) {
if (!hexstr[1]) {
applog(LOG_ERR, "hex2bin str truncated");
return false;
}
hex_byte[0] = hexstr[0];
hex_byte[1] = hexstr[1];
*p = (unsigned char) strtol(hex_byte, &ep, 16);
if (*ep) {
applog(LOG_ERR, "hex2bin failed on '%s'", hex_byte);
return false;
}
p++;
hexstr += 2;
len--;
}
return (len == 0 && *hexstr == 0) ? true : false;
}
И моя основная функция для тестирования:
int main()
{
unsigned char p[40];
memset(p, 0, 40);
hex2bin(p, "e1b3f5c0", 4);
printf("strtol: %x\n", strtol("e1b3f5c0", 0, 16));
printf("hex2bin: %x\n", p);
}
Тестирование дало: 1.
strtol: e1b3f5c0
hex2bin: e6474980
2.
strtol: e1b3f5c0
hex2bin: e0cc9980