Heximal в двоичный в cpu-miner - PullRequest
1 голос
/ 19 июня 2020

Разбираю код для проекта 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
...