использование sscanf в C для преобразования шестнадцатеричной строки в аргументы команды для bash - PullRequest
0 голосов
/ 25 сентября 2018

Попытка создать шестнадцатеричный декодер для чтения аргументов из файла командной строки, и у меня возникают проблемы в C с легкими операциями со строковыми функциями.Цель моего шестнадцатеричного декодера состоит в том, чтобы я мог взять шестнадцатеричную строку, например '2d6c002d6100f757372', и превратить ее в набор инструкций для bash, в данном случае -l -a / usr.Моя проблема, однако, заключается в том, что с моим текущим кодом я могу извлечь только каждый из символов, извлеченных из строки, по отдельности, поэтому я получаю 10 символов, которые не имеют смысла для оболочки bash в отдельности.В идеале я хотел бы иметь

args[0] = binary_path
args[1] = "-l"
args[2] = "-a"
args[3] = "/usr"
args[4] = NULL

, но я не могу понять, как сгруппировать строки, которые встречаются перед каждым из 0x00 в моей шестнадцатеричной строке.Вот код, который у меня пока есть для этой проблемы:

int i = 0;
char *hexString = "2d6c002d6100f757372"
char *hexPtr = hexString;
unsigned int *result = calloc(strlen(hexString)/2 + 1, sizeof *result);

while (sscanf(hexPtr, "%02x", &result[i++])) {
    hexPtr += 2;
    if (hexPtr >= hexString + strlen(hexString)) 
       break;


return result;}

1 Ответ

0 голосов
/ 25 сентября 2018
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int hex2dec(int value) // used to convert a hex digit to decimal
{
    if (isdigit(value))
        return value - '0';

    value = toupper(value); // to make the function more robust for various input
    if ('A' <= value && value <= 'F')
        return 10 + value - 'A';

    return -1;
}

int main(void)
{
    char const *hex_str = "2d6c002d61002f757372";
    size_t hex_str_len = strlen(hex_str);

    size_t len = hex_str_len / 2; // there are half as many characters than hex digits
    char *str = calloc(len + 1, 1);
    size_t str_count = 1;

    for (size_t i = 0; i < len; ++i) {
        str[i] = hex2dec(hex_str[i * 2]) * 16 + hex2dec(hex_str[i * 2 + 1]);
        if (!str[i]) // at every 0-terminator
            ++str_count;  // count a new string
    }

    char **split_str = malloc(str_count * sizeof(char*));

    for (size_t i = 0, offset = 0; i < str_count; ++i) {
        size_t len = strlen(str + offset);
        split_str[i] = calloc(len + 1, 1);
        strcpy(split_str[i], str + offset);
        offset += len + 1;
    }

    free(str);

    // Output:
    for (size_t i = 0; i < str_count; ++i)
        printf("\"%s\"\n", split_str[i]);

    // Cleanup:
    for (size_t i = 0; i < str_count; ++i)
        free(split_str[i]);
    free(split_str);
}

Выход:

"-l"
"-a"
"/usr"
...