Преобразование входной строки в шестнадцатеричное не дает правильный размер - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь преобразовать входную строку из конвейера в шестнадцатеричный, ввод - 8 КБ, но преобразованный шестнадцатеричный код - всего 6 КБ, я печатаю нормальный ввод, и появляются правильные строки. Я также пытаюсь записать эту шестнадцатеричную строку в разделяемую память, возможно, моя проблема в указателе памяти, но я не уверен.

Но он правильно выводит шестнадцатеричный код для небольших входных данных, я застрял.

Строка в гекс:

void stringtohex(char *input, char *output) {
    int loop;
    int i; 

    i = 0;
    loop = 0;

    while (input[loop] != '\0') {
        sprintf((char*)(output + i), "%02X", input[loop]);
        loop += 1;
        i += 2;
    }
    //insert NULL at the end of the output string
    output[i++] = '\0';
}

Чтение:

    int num;
    char s[BUFFER_SIZE];
    while ((num = read(fd, s, BUFFER_SIZE)) > 0) {     
        //fprintf(stderr, "input: \n%s\n", s);
        int len = strlen(s);
        char hex[(len * 2) + 1];
        stringtohex(s, hex);
        sprintf(ptr_child_2, "%s", hex);
        ptr_child_2 += strlen(hex);
    }

здесь ptr - это void *, сопоставленный с общей памятью.

1 Ответ

1 голос
/ 17 февраля 2020

Использование read для чтения данных в s, а затем трактовать s, как будто это строка (например, вы звоните strlen(s);), неправильно. Функция read не имеет представления о строках. Он просто пытается прочитать BUFFER_SIZE байтов. Таким образом, вы можете получить меньше чем строку или несколько строк в s за один read, но маловероятно, что вы получите ровно одну строку (как предполагает ваш код).

Также обратите внимание, что вы никогда используйте num в своем коде. Это также странно, поскольку num содержит количество байтов, которые фактически были сохранены в s. Попробуйте использовать num для управления количеством байтов для преобразования.

Или, если вы действительно хотите работать со строками, взгляните на fgets.

Кстати: проверьте, что sprintf возвращает ... вы найдете это полезным; -)

Кстати: вы также можете рассмотреть strcat вместо sprintf

Правильное решение может зависеть от входных данных но что-то вроде этого:

char* stringtohex(char* input, char* output, int num)
{
    int loop=0;

    while(loop < num)
    {
        sprintf(output, "%02X", input[loop]);
        loop+=1;
        output += 2;
    }

    //insert NULL at the end of the output string
    *output = '\0';
    return output;
}

Чтение части Примечание: ptr_child_2 должно указывать на пустую строку, чтобы начать с:

        char RESULT[SOME_SUFFICIENT_BIG_NUMBER] = ""; // Or dynamic allocation  
        char* ptr_child_2 = RESULT;
        int num;
        char s[BUFFER_SIZE];
        while((num = read(fd, s, BUFFER_SIZE)) > 0)
        {     
            ptr_child_2 = stringtohex(s, ptr_child_2, num);
        }
        printf("%s\n", RESULT);
...