在C中将ASCII转换为HEX时跳过特殊字符

时间:2018-06-06 08:18:41

标签: c hex ascii data-conversion

我需要帮助才能将ascii转换为十六进制数据输出仅用于字母数字字符(不包括特殊字符)。

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 :(得分:2)

使用不同的变量进行循环旋转并将数据添加到数组中。

#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。

答案 1 :(得分:1)

您需要单独计算输入和输出位置。

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会递增。这不仅用于进入下一个字符,还可以定义输出数组中的位置。这意味着在解析输入时不会触摸out-array中的2个字节。

如果偶然你有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++;
    }
}