Search code examples
chexdata-conversion

How can i speed up hexadecimal characters conversion to binary characters


I have already a function that convert hex char(input) to binary char(output). it works perfect, for small amount of data(input length).But when the input is too big, it stuck/not working. May be strcat take too much time. Is there some alternate solution, So i can convert big hex input characters into equivalent binary. My function is:

void fun_hex_ch_2bin(int len_hex_str,uint8_t *hex,uint8_t *bin){
  /* Extract first digit and find binary of each hex digit */
  int i=0,j=0;

   char array_hex[16]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
   uint8_t *new_hex=malloc(len_hex_str*2);
   char hex_char1,hex_char2;
   j=0;
   for(i=0;i<len_hex_str;i++)
   {
      hex_char1=array_hex[hex[i]&0x0f];
      hex_char2=array_hex[(hex[i]>>4)&0x0f];
      //printf("%c  %c\n",hex_char1,hex_char2);
      new_hex[j]=hex_char2;
      new_hex[j+1]=hex_char1;
      j=j+2;
   }

    for(i=0; i<len_hex_str*2; i++)
    {
        switch(new_hex[i])
        {
            case '0':
                strcat(bin, "0000");
                break;
            case '1':
                strcat(bin, "0001");
                break;
            case '2':
                strcat(bin, "0010");
                break;
            case '3':
                strcat(bin, "0011");
                break;
            case '4':
                strcat(bin, "0100");
                break;
            case '5':
                strcat(bin, "0101");
                break;
            case '6':
                strcat(bin, "0110");
                break;
            case '7':
                strcat(bin, "0111");
                break;
            case '8':
                strcat(bin, "1000");
                break;
            case '9':
                strcat(bin, "1001");
                break;
            case 'a':
            case 'A':
                strcat(bin, "1010");
                break;
            case 'b':
            case 'B':
                strcat(bin, "1011");
                break;
            case 'c':
            case 'C':
                strcat(bin, "1100");
                break;
            case 'd':
            case 'D':
                strcat(bin, "1101");
                break;
            case 'e':
            case 'E':
                strcat(bin, "1110");
                break;
            case 'f':
            case 'F':
                strcat(bin, "1111");
                break;
            default:
                printf("Invalid hexadecimal input.");
        }
    }

}

Solution

  • Just use sprintf() instead of strcat()

    char *bin; // points to a long enough buffer
    int binlen = 0;
    binlen += sprintf(bin + binlen, "something"); // strcat(bin, "something");
    binlen += sprintf(bin + binlen, "otherthing"); // strcat(bin, "otherthing");
    binlen += sprintf(bin + binlen, "foobar"); // strcat(bin, "foobar");
    //...
    // you can even do
    binlen += sprintf(bin + binlen, "%.2f", 2.71828); // strcat(bin, "2.72");