Преобразуйте 20-байтовую шестнадцатеричную (символьную строку) в 10-байтовую двоичную символьную строку в C - PullRequest
1 голос
/ 20 января 2020

У меня хранится следующая строка. 16 байтов для 1-F и 4 nullBytes в конце.

e.g. 1234567890ABCDEF0000
unsigned char input[] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x00, 0x00, 0x00, 0x00};

Как получить 10-байтовый двоичный код этого?

РЕДАКТИРОВАТЬ:

Я пытаюсь правильно используйте функцию SHA1 криптографической библиотеки openssl. У меня есть задача прочитать «соль» и «пароль» из командной строки.

Затем сложить их вместе, чтобы у меня было «соль» + «|» + "пароль".

Если соль не передана, соль - это просто "\ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0", что на 10 байтов верно? но если соль передается, это может быть "1234567890ABCDEF"

. Затем мне нужно заполнить ее вправо нулевыми байтами, чтобы у меня было всего 10 байтов. Но "1234567890ABCDEF" уже составляет 16 байтов, поэтому Я должен преобразовать это. Я не знаю, я действительно борюсь с частью памяти в c

Ответы [ 2 ]

0 голосов
/ 20 января 2020

Эй, я мало что понял из вашего примера, но то, что вы описываете как ниже +, ограничения могут быть решены следующим образом. Смотрите фрагмент.

Если соль не передана, соль просто "\ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0", что на 10 байтов верно? но если соль пройдена, это может быть "1234567890ABCDEF"

#include <stdio.h>
#include <string.h>

#define SALT_MAX_BYTES 10

int main(int argc, char *argv[]) {
    // Init the whole array with 0-s, which is the same value as '\0'
    char salt[SALT_MAX_BYTES] = {0};
    // Here get the input, now assuming ./a.out [salt]
    if (argc > 1) // The executable name is always passed
    {
        printf("Input: %s\n", argv[1]);
        // Assuming ASCII...
        // Assuming you want to use the ASCII value representation of input "42"
        // and not the number 42 ... 
        strncpy(salt, argv[1], SALT_MAX_BYTES);
        // Note: from here on you must strictly handle salt as length terminated.
        // => input may have more then SALT_MAX_BYTES
    }
    else
    {
        puts("Usage: ...");
        return -1;
    }

    // Left aligned output, showing nothing for \0 bytes...
    printf("Entered salt is : <%-*.*s>\n", SALT_MAX_BYTES, SALT_MAX_BYTES, salt);
    return 0;
}
0 голосов
/ 20 января 2020

Самым простым может быть:

Создать 0-инициализированный массив из 10 байтов:

unsigned char salt[10] = { 0 };

, а затем прочитать в шестнадцатеричном формате байтово с помощью sscanf():

sscanf(input, "%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx",
              &salt[0], &salt[1], &salt[2], &salt[3], &salt[4],
              &salt[5], &salt[6], &salt[7], &salt[8], &salt[9]);

Это преобразует столько байтов, сколько необходимо; если в качестве соли указано только 6 шестнадцатеричных чисел, первые три байта заполняются, а остальные остаются равными 0.

Это должно сделать то, что вы ожидаете.

...