假设我有一个充满数据的缓冲区,并且我将其从网络上删除了。
uint8_t buffer[100];
现在,假设该缓冲区具有不同的字段。有些是1字节,有些是2字节,有些是4字节。所有这些字段都打包在缓冲区中。
现在假装我想获取16位字段之一的值。假设在缓冲区中,字段的存储方式如下:
buffer[2] = one byte of two byte field
buffer[3] = second byte of two byte field
我可以这样获取该值:
uint16_t* p_val;
p_val = (int16_t*) &buffer[2];
or
p_val = (int16_t*) (buffer + 2);
printf("value: %d\n", ntohs(*p_val));
这种方法有什么问题吗?还是我应该注意的对齐问题?
正如评论中提到的那样,是的,您提出的方法存在问题。尽管它可能在目标计算机上工作,或者可能在给定的情况下工作,但通常在不同指针类型之间进行转换是不安全的。(有例外。)
为了正确考虑对齐方式和字节顺序,您可以这样做:
union convert {
uint32_t word;
uint16_t halfword[2];
uint8_t bytes[4];
} convert;
uint16_t result16;
memcpy(convert.bytes, buffer + offset, 2);
/* assuming network byte order: */
result16 = ntohs(convert.halfword[0]);
如果您控制数据格式,那么网络字节顺序是一个不错的选择,因为程序不需要显式确定,假设或知道运行它的计算机的字节顺序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句