Ashwini
Ashwini

Reputation: 19

Skip special characters while converting ASCII to HEX in C

I need help to get the ascii to hex data output only for alphanumeric characters(excluding special characters).

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

Output breaks after non alphanumeric characters. It contains output string only until non alphanumeric characters.

Code:

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;
}

Can anyone help me to get expected output?

Thanks in advance.

Upvotes: 0

Views: 344

Answers (2)

Cyril P Joy
Cyril P Joy

Reputation: 81

Use different variables for loop rotation and adding data into array.

#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;
}

This code will give you the expected result 38363734313330303131.

Upvotes: 2

Gerhardh
Gerhardh

Reputation: 12404

You need to count input and output position separately.

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]);
    }
}

If your condition is true and you print the text, the counter i is incremented. This is not only used to get to the next in-character, but also do define the position in output-array. This means the 2 bytes in the out-array are not touched while you parse the input.

If by accident you have 0 bytes there, your string is terminated here.

This would lead to the following layout: "3836373431\0\03330303131" which is printed as "3836373431".

You might add another variable for output and only increment when you really convert to hex.

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++;
    }
}

Upvotes: 1

Related Questions