我的转换值是否正确?十六进制字符串到字节数组
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]
)。
要打印您需要的所有元素,请在循环中一个一个地打印。
我遇到了以下问题: 我从套接字接收到一个十六进制字符串,然后将其转换为字节数组并将其保存到 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]
)。
要打印您需要的所有元素,请在循环中一个一个地打印。