我的转换值是否正确?十六进制字符串到字节数组

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

我遇到了以下问题: 我从套接字接收到一个十六进制字符串,然后将其转换为字节数组并将其保存到 uint8_t 数组中。这是转换函数(有效):

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

然后,我将这个字节数组重新转换为十六进制字符串,只是为了知道转换是否正确。转换是正确的,因为从套接字接收到的十六进制字符串(在转换为字节数组之前)与从 uint8_t 转换为十六进制字符串后的字符串相同:这里是流程 -> HEX_STRING -> UINT8_T 数组 -> 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;
}

无论如何,当我打印字节数组时,结果看起来很奇怪,因为它在我看来太短了。问题出在哪里?它在印刷品中吗?

n = recvfrom(sockfd, (char *)buffer, 1024, 
            MSG_WAITALL, ( struct sockaddr *) &cliaddr,
            &len);
buffer[n] = '[=12=]';
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);
}

结果是:

[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

同声明

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

您没有打印数组 uint8_payload 的内容。相反,您打印指向其第一个元素的指针(请记住 uint8_payload 将衰减为 &uint8_payload[0])。

要打印您需要的所有元素,请在循环中一个一个地打印。