Convert hexadecimal string to output readable in C

2

I would like to save a text in hexadecimal, and calling a function, the hexadecimal string is converted to a readable char string ie decoding hexadecimal, such as 0x6f0x69 to oi .

I've tried the following:

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

int main(void) {

    char hex[3];
    hex[0]="0x69";
    hex[1]="0x20";
    hex[2]="0x31";

    char text[100];
    int i = 0;
    char decimalNumber[100];
    while(i<3;i++){
        sscanf(hex,"%x",&decimalNumber);
        text+=decimalNumber;
    }
    printf("The value of decimalNumber is %s\n",text);
    return 0;
}

If possible, somehow allow me to save different strings and calling only one function for the conversion of them, eg

char hex1 = ...
char hex2 = ...
char srt[50] = converter(hex);
    
asked by anonymous 04.09.2016 / 22:00

1 answer

3

Using your example.

Now putting the complete program, tested in the ideone.

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

int main()
{
    // para loop "for"
    int i;

    // area de entrada
    char hex[] = "6f69";
    int sizeHex = strlen(hex);

    // area de saida
    char text[10];

    // variaveis de conveniencia
    char ch, high, low;

    // trata todos os caracteres da area de entrada
    for (i = 0; i < sizeHex; i += 2)
    {
       high = hex[i];
       high -= 0x30;
       if (high > 9) high -= 7;
       high <<= 4;

       low = hex[i+1];
       low -= 0x30;
       if (low > 9) low -= 7;

       ch = high | low;

       // transfere para area de saida            
       text[i/2] = ch;
    }

    text[i/2] = 0; // para delimitar string

    printf("string hexadecimal: %s\n",text);
}

Considering the "0x":

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

int main()
{
    // para loop "for"
    int i;

    // area de entrada
    char hex[] = "0x6F0x69";
    int sizeHex = strlen(hex);

    // area de saida
    char text[10];

    // ponteiro para area de saida
    char* pText = text;

    // area de trabalho, vai ser usada com scanf --> vai 0x6F, depois 0x69, etc
    char tmp[5];

    // variavel de conveniencia
    int ch;

    tmp[4] = 0; // paa delimitar string de trabalho

    // trata todos os caracteres da area de entrada
    // anda de 4 em 4 porque cada caracter esta' codificado como "0xNN"
    for (i = 0; i < sizeHex; i += 4)
    {
       memcpy(tmp, hex+i, 4);
       sscanf(tmp, "%x", &ch);

       // transfere para area de saida, e avanca ponteiro na area de saida
       *pText++ = (char)ch;
    }

    *pText = 0; // para delimitar string

    printf("string convertida: %s\n",text);
}

That's not what was asked, but I find it interesting too.

#include <stdio.h>

int main()
{
    // para loop "for"
    int i;

    // area de entrada
    char hex[3];

    // area de saida
    char text[10];

    // variaveis de conveniencia
    char ch, high, low;

    // constante caracter usas aspas simples (apostrofo), e '\xNN'
    hex[0] = '\x69';
    hex[1] = '\x20';
    hex[2] = '\x31';

    // trata todos os caracteres da area de entrada
    for (i = 0; i < 3; i++)
    {
       // pega um caracter da area de entrada
       ch = hex[i];

       // converte meio byte 'a esquerda para caracter hexa visivel
       high = ch >> 4;        // desloca 4 bits 'a direita
       high &= 0x0F;          // zera os 4 bits da esquerda
       if (high > 9) high += 7; // se for maior que 9, ajusta o valor para resultar numa letra
       high = high + 0x30; // transforma em caracter visivel

       // repete para meio byte 'a direita (nao precisa deslocar 4 bits)
       low = ch & 0x0F;
       if (low > 9) low += 7;
       low = low + 0x30;

       // transfere para area de saida            
       text[2*i] = high;
       text[2*i+1] = low;
    }

    text[2*i] = 0; // para delimitar string

    printf("string convertida: %s\n",text);
}
04.09.2016 / 23:11