Convert two ASCII Hexadecimal Characters (Two ASCII bytes) in one byte

后端 未结 6 2372
余生分开走
余生分开走 2020-12-18 13:08

I want to convert two ASCII bytes to one hexadecimal byte. eg.

0x30 0x43 => 0x0C , 0x34 0x46 => 0x4F ...

The ASCII bytes are a number bet

6条回答
  •  庸人自扰
    2020-12-18 13:18

    The task:

    Convert a string containing hexadecimal ascii characters to its byte values so ascii "FF" becomes 0xFF and ascii "10" (x31x30x00) becomes 0x10

    char asciiString[]="aaAA12fF";// input ascii hex string 
    char result[4];               // byte equivalent of the asciiString (the size should be at half of asciiString[])
    

    // the final result should be:

    result[0] = 0xAA;
    result[1] = 0xAA;       
    result[2] = 0x12;
    result[3] = 0xFF;
    

    //1. Firt step: convert asciiString so it contains upper cases only:

    // convert string to upper cases:
    stringToUpperCases(asciiString);
    

    use:

    void stringToUpperCases(char *p)
    {   
        for(int i=0; *(p+i) !='\0'; i++)
        {
            *(p+i) = (unsigned char) toupper( *(p+i) );
        }
    }
    

    //2. Convert a string containing hexadecimal ascii characters to its byte values:

    // convert string to bytes:
    
    int nrOfBytes = stringToBytes(asciiString,result);
    
    //use:  
    unsigned char charToHexDigit(char c)
    {
    if (c >= 'A')
        return (c - 'A' + 10);
    else
        return (c - '0');
    }
    
    unsigned char ascii2HexToByte(char *ptr)
    {
        return charToHexDigit( *ptr )*16 + charToHexDigit( *(ptr+1) );
    }
    
    int stringToBytes(char *string, char *result)
    {
        int k=0;
        int strLen = strlen(string);
    
        for(int i = 0; i < strLen; i = i + 2)
        {
            result[k] = ascii2HexToByte( &string[i] );
            k++;
        }
    
        return k; // number of bytes in the result array 
    }   
    

    //3. print result:

    printNrOfBytes(nrOfBytes, result);
    

    // use:

    void printNrOfBytes(int nr, char *p)
    {
       for(int i= 0; i < nr; i++)
        {
            printf( "0x%02X ", (unsigned char)*(p+i) );
        }
        printf( "\n");
    }
    

    //4. The result should be:

    0xAA 0xAA 0x12 0xFF

    //5. This is the test program:

    char asciiString[]="aaAA12fF"; // input ascii hex string 
    char result[4];                // result  
    // convert string to upper cases:
    stringToUpperCases(asciiString);
    
    // convert string to bytes
    int nrOfBytes = stringToBytes(asciiString,result);
    
    // print result:
    printNrOfBytes(nrOfBytes, result);
    
    // result:
    //  0xAA 0xAA 0x12 0xFF
    

提交回复
热议问题