Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Is the value of my conversion correct? Hex string to byte array

I’ve the following issue:
from a socket, I receive an hexadecimal string, then I convert it to a byte array and save it into a uint8_t array. Here is the conversion function (it works):

static size_t convert_hex(uint8_t *dest, size_t count, const char *src)

    {
    size_t i = 0;
    int value;
    for (i; i < count && sscanf(src + i * 2, "%2x", &value) == 1; i++)
    {
        dest[i] = value;
    }
    return i;
}

Then, I reconvert this byte array to an hex string, only to know if the conversion was correct. The conversion is correct beacuse the hexadecimal string received from the socket (before the conversion to a byte array), is the same string after the conversion from uint8_t to hexadecimal string: here is the flow -> HEX_STRING -> UINT8_T ARRAY -> HEX_STRING

static size_t convert_hex_inv(char *dest, size_t count, const uint8_t *src)
{
    size_t i = 0;
    for (i = 0; i < count && sprintf(dest + i * 2, "%02X", src[i]) == 2; i++)
        ;
    return i;
}

Anyway, when I print the byte array, the result seems stange, because it appears to me too short. Where is the problem? Is it in the print?

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

n = recvfrom(sockfd, (char *)buffer, 1024, 
            MSG_WAITALL, ( struct sockaddr *) &cliaddr,
            &len);
buffer[n] = '\0';
printf("[SKT]\tHex String: %s. Message Type: %c\n", buffer, buffer[3]);
uint8_t uint8_payload[2048];
uint16_t uint_size = convert_hex(uint8_payload, n, buffer);
printf("[SKT]\tByte Array: %" PRIu8 "\n", uint8_payload);
char hex_array[n];
convert_hex_inv(hex_array, uint_size, uint8_payload);
printf("[SKT]\tHex String: %s\n", hex_array);
}

The result is:

[2021-11-11 12:02:23.410] [SKT] Hex String : 0201000000A8C0000000540000000000000000000000000446E88CEB36E7806FFEFFE000192E5B0F001C029FFFE30101F7D0000C003C000D000401D1C0FF6C3C80
[2021-11-11 12:02:23.410] [SKT] Byte Array: 4152851276 -> **THIS VALUE IS QUITE STRANGE**
[2021-11-11 12:02:23.410] [SKT] Hex String: 0201000000A8C0000000540000000000000000000000000446E88CEB36E7806FFEFFE000192E5B0F001C029FFFE30101F7D0000C003C000D000401D1C0FF6C3C80

>Solution :

With the statement

printf("[SKT]\tByte Array: %" PRIu8 "\n", uint8_payload);

You don’t print the contents of the array uint8_payload. Instead you print the pointer to its first element (remember that uint8_payload will decay to &uint8_payload[0]).

To print all the elements you need to do it one by one in a loop.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading