Пропустить специальные символы при преобразовании ASCII в HEX в C - PullRequest
0 голосов
/ 06 июня 2018

Мне нужна помощь для вывода данных в формате ascii to hex только для буквенно-цифровых символов (исключая специальные символы).

Input String is: 86741-30011
Expected result is: 38363734313330303131 
Actual Result  is: 3836373431

Разрывы вывода после не буквенно-цифровых символов.Содержит строку вывода только до буквенно-цифровых символов.

Код:

int main(void){
    char word[12] = { '8', '6','7','4','1','-','3','0','0','1','1'};
    char outword[20];
    int i, len;
    len = strlen(word);
    printf("Input string: %s\n", word);
    //printf("Total length: %d\n", len);
    if(word[len-1]=='\n') word[--len] = '\0';
    for(i = 0; i<len; i++) {
        if (isalnum(word[i]) == 0) {
            printf("%c is not an alphanumeric character.\n", word[i]);
        } else {
            sprintf(outword+i*2 , "%02X", word[i]);
        }
    }
    printf("Hex output:%s\n", outword); return 0;
}

Может ли кто-нибудь помочь мне получить ожидаемый результат?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Используйте разные переменные для вращения цикла и добавления данных в массив.

#include <stdio.h>

int main(void){
    char word[12] = { '8', '6','7','4','1','-','3','0','0','1','1'};
    char outword[20];
    int i, j, len;
    len = strlen(word);
    printf("Input string: %s\n", word);
    //printf("Total length: %d\n", len);
    if(word[len-1]=='\n') word[--len] = '\0';
    for(i = 0,j=0; i<len; i++) {
        if (isalnum(word[i]) == 0) {
            printf("%c is not an alphanumeric character.\n", word[i]);
        } else {
            sprintf(outword+j*2 , "%02X", word[i]);
            j=j+1;
        }
    }
    printf("Hex output:%s\n", outword); return 0;
}

Этот код даст ожидаемый результат 38363734313330303131.

0 голосов
/ 06 июня 2018

Вам необходимо подсчитать позицию ввода и вывода отдельно.

for(i = 0; i<len; i++) 
{
    if (isalnum(word[i]) == 0) {
        printf("%c is not an alphanumeric character.\n", word[i]);
    } else {
        sprintf(outword+i*2 , "%02X", word[i]);
    }
}

Если ваше условие истинно и вы печатаете текст, счетчик i увеличивается.Это не только используется для перехода к следующему символу, но и определяет позицию в массиве вывода.Это означает, что 2 байта в массиве out не затрагиваются, пока вы анализируете ввод.

Если случайно у вас там 0 байт, ваша строка заканчивается здесь.

Это может привести кследующая схема: "3836373431\0\03330303131", которая печатается как "3836373431".

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

int outpos;
for(i = 0, outpos = 0; i<len; i++)
{
    if (isalnum(word[i]) == 0) {
        printf("%c is not an alphanumeric character.\n", word[i]);
    } else {
        sprintf(outword+outpos*2 , "%02X", word[i]);
        outpos++;
    }
}
...