简单的方法是手动重建uint16_t
s,以牺牲速度为代价:
uint8_t *packet = ...;
uint16_t fieldID = (packet[0] << 8) | packet[1]; // assumes big-endian host order
uint16_t length = (packet[2] << 8) | packet[2];
uint8_t *data = packet + 4;
packet += 4 + length;
如果您的处理器支持它,您可以键入双关或使用联合(但要注意严格的别名)。
uint16_t fieldID = htons(*(uint16_t *)packet);
uint16_t length = htons(*(uint16_t *)(packet + 2));
请注意,未对齐的访问并不总是受支持(例如,它们可能会产生某种故障),并且在其他体系结构上,它们是受支持的,但会降低性能。
如果数据包未对齐,您始终可以将其复制到静态缓冲区中,然后读取它:
static char static_buffer[65540];
memcpy(static_buffer, packet, packet_size); // make sure packet_size <= 65540
uint16_t fieldId = htons(*(uint16_t *)static_buffer);
uint16_t length = htons(*(uint16_t *)(static_buffer + 2));
就个人而言,我只会选择选项#1,因为它是最便携的。