十六进制转ASCII字符串

14

我有一个十六进制字符串,希望在C语言中将其转换为ASCII字符串。我应该如何完成这个任务?


2
一个十六进制字符串(例如:“F00BA4”)不是ASCII字符串的特殊情况吗?还是在使用EBCDIC? :) - pmg
4个回答

17

您需要同时取出2个十六进制字符...然后计算其int值,之后进行char转换,如下所示:

char d = (char)intValue;

对于十六进制字符串中的每两个字符都要这样做

如果字符串字符仅为0-9A-F,则此方法有效:

#include <stdio.h>
#include <string.h>

int hex_to_int(char c){
        int first = c / 16 - 3;
        int second = c % 16;
        int result = first*10 + second;
        if(result > 9) result--;
        return result;
}

int hex_to_ascii(char c, char d){
        int high = hex_to_int(c) * 16;
        int low = hex_to_int(d);
        return high+low;
}

int main(){
        const char* st = "48656C6C6F3B";
        int length = strlen(st);
        int i;
        char buf = 0;
        for(i = 0; i < length; i++){
                if(i % 2 != 0){
                        printf("%c", hex_to_ascii(buf, st[i]));
                }else{
                        buf = st[i];
                }
        }
}

2

有些字符,例如字母i-o无法转换为相应的ASCII字符。 例如,在字符串'6631653064316f30723161'中对应于fedora。但它给出了fedra

只需稍微修改hex_to_int()函数,它就可以适用于所有字符。 修改后的函数如下:

int hex_to_int(char c)
{
    if (c >= 97)
        c = c - 32;
    int first = c / 16 - 3;
    int second = c % 16;
    int result = first * 10 + second;
    if (result > 9) result--;
    return result;
}

现在尝试一下,它可以适用于所有字符。

1

strtol() 在这里是您的好帮手。第三个参数是您要转换的数字基数。

例如:

#include <stdio.h>      /* printf */
#include <stdlib.h>     /* strtol */

int main(int argc, char **argv)
{
    long int num  = 0;
    long int num2 =0;
    char * str. = "f00d";
    char * str2 = "0xf00d";

    num = strtol( str, 0, 16);  //converts hexadecimal string to long.
    num2 = strtol( str2, 0, 0); //conversion depends on the string passed in, 0x... Is hex, 0... Is octal and everything else is decimal.

    printf( "%ld\n", num);
    printf( "%ld\n", num);
}

1
@Yvain 不对。首先,使用 itoa() 进行转换是错误的。atoi() 只接受十进制输入。atof() 接受十六进制(需要以 "0x" 开头,如上面的第二个示例),并且仅适用于 C99 或更高版本(如果有必要的话)。 - Baldrickk

0

如果我理解正确,您想知道如何将以十六进制字符串编码的字节转换为ASCII文本形式,例如"537461636B"将被转换为"Stack",在这种情况下,以下代码应该解决您的问题。

尚未运行任何基准测试,但我认为它不是效率的巅峰。

static char ByteToAscii(const char *input) {
  char singleChar, out;
  memcpy(&singleChar, input, 2);
  sprintf(&out, "%c", (int)strtol(&singleChar, NULL, 16));
  return out;
}

int HexStringToAscii(const char *input, unsigned int length,
                            char **output) {
  int mIndex, sIndex = 0;
  char buffer[length];
  for (mIndex = 0; mIndex < length; mIndex++) {
    sIndex = mIndex * 2;
    char b = ByteToAscii(&input[sIndex]);
    memcpy(&buffer[mIndex], &b, 1);
  }
  *output = strdup(buffer);
  return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接