【发布时间】:2014-12-10 17:42:41
【问题描述】:
所以我有一个充满字节的缓冲区,我知道应该至少有 16 个字节长。 我不关心字节 0 - 11。 我知道12到15这4个字节代表一个32位的数字。
我怎样才能提取这些字节并将它们表示为 32 位数字。
【问题讨论】:
标签: c arrays data-conversion
所以我有一个充满字节的缓冲区,我知道应该至少有 16 个字节长。 我不关心字节 0 - 11。 我知道12到15这4个字节代表一个32位的数字。
我怎样才能提取这些字节并将它们表示为 32 位数字。
【问题讨论】:
标签: c arrays data-conversion
您可以将每个字节转换为一个 8 位无符号数,并且您可以使用位运算将这些数字组合为一个 32 位数:
uint32_t result = 0;
for (int i = 12; i < 16; i++) {
result <<= 8;
result |= (uint8_t)bytes[i];
}
【讨论】:
unsigned char ——您真的需要 4 个字节吗?您是否检查了缓冲区的实际内容,例如使用调试器还是逐字节打印?)
我对@987654321@ 着迷,我情不自禁。这可能会有所帮助:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <arpa/inet.h>
uint32_t
convert_int(char bytes[4])
{
union {uint32_t n; char bytes[4];} box;
memcpy(&box.bytes[0], bytes, sizeof(*bytes));
return ntohl(box.n);
}
int
main(void)
{
uint32_t number;
number = convert_int("\x0A\x00\x00\x00");
printf("%d\n", number);
return 0;
}
convert_int() 接受网络字节顺序中的 4 个字节(大端)(最高有效字节在前)并将其转换为 32 位整数;主机字节顺序(大端或小端)。由于您可以控制缓冲区,因此您可以根据需要放置参数。
【讨论】: