2011-03-23 29 views
10

tengo una cadena hexagonal y quiero que se convierta en cadena ascii en C. ¿Cómo puedo lograr esto?Hex a cadena de conversión ascii

+1

no es una cadena hexadecimal (por ejemplo: ' "F00BA4"') un caso especial de cadena ASCII? ¿O está usando EBCDIC? :) – pmg

Respuesta

13

Es necesario tomar 2 caracteres (hex) al mismo tiempo ... luego calcular el valor int y después de eso hacer la conversión carbón como ...

char d = (char)intValue;

hacer esto para cada 2chars en la cadena hexadecimal

esto funciona si los caracteres de cuerdas son solamente 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

pocos personajes como alphabe ts i-o no se pudo convertir en los caracteres ASCII respectivos. como en la cadena '6631653064316f30723161' corresponde a fedora. pero da fedra

Simplemente modifique la función hex_to_int() un poco y funcionará para todos los caracteres. función modificada es

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

Ahora trata de que funcione para todos los caracteres.

0

strtol() es tu amigo aquí. El tercer parámetro es la base numérica que está convirtiendo.

Ejemplo:

#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); 
} 
+0

así que no 'itoa' ... – Yvain

+0

@Yvain no. para empezar, la conversión con 'itoa()' es el camino equivocado. 'atoi()' solo acepta entrada decimal. 'atof' acepta hexadecimal (necesita comenzar por' "0x" 'como en el segundo ejemplo anterior, y solo funciona con C99 o posterior (si eso importa)) – Baldrickk