问题 十六进制到ascii字符串转换


我有一个十六进制字符串,并希望它在C中转换为ascii字符串。我怎么能完成这个?


6999
2018-03-23 09:27


起源

不是十六进制字符串(例如: "F00BA4")ascii字符串的特例?或者正在使用EBCDIC? :) - pmg


答案:


你需要同时取2(十六进制)字符...然后计算int值 之后使char转换成......

char d = (char)intValue;

为十六进制字符串中的每个2chars执行此操作

如果字符串字符仅为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];
                }
        }
}

13
2018-03-23 09:33





很少像字母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;
}

现在尝试它将适用于所有角色。


2
2018-03-12 08:16





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
2017-07-05 14:00



所以不行 itoa... - Yvain
@Yvain没有。一开始,转换用 itoa() 是错误的方式。 atoi() 只接受十进制输入。 atof 确实接受十六进制(需要开头 "0x" 如上面的第二个例子,只适用于C99或更高版本(如果这很重要)) - Baldrickk