【发布时间】:2020-02-06 07:49:06
【问题描述】:
我应该从 pcap 文件中读取数据到数组中,然后将其转换为结构指针。
还有字节序的问题。
这是我的代码
#include "stdio.h"
#pragma pack(1)
struct header
{
unsigned char len:4;
unsigned char version:4;
unsigned short pkg_len;
unsigned short pkg_flag;
};
int main()
{
// assume i read 5 bytes from a file into array a.
unsigned char a [] = {0x45, 0xff, 0x08, 0xee, 0x09};
header *i = (header *)&a;
printf("%02hx %02hx %02hx %02hx\n", i->version, i->len, i->pkg_len, i->pkg_flag);
return 0;
}
打印出来了:
04 05 08ff 09ee
但是,我想要的是:
04 05 ff08 ee09
我该怎么办?非常感谢!
【问题讨论】:
-
你真正的问题是什么?为什么不能像
header i[]={{4,5,0xff08,0xee09}}那样做? -
不保证位域的顺序。您最好使用手动位移,这样您就可以更好地控制使用哪些位以及如何使用。此外,
%x需要unsigned int作为默认输入,因此在将值传递给printf时需要转换它们。对于unsigned short字段,您可以使用%hx而不进行强制转换。 -
因为数组 a 是从无法更改的文件中读取的。我能做的就是将它读入一个数组并将其转换为一个结构指针。
-
可以修改
header结构中的字段顺序吗?short字段的字节顺序可以用htons解决,但是没有内置函数可以在单个字节内交换顺序。无论如何,这将是很多实现和设备特定的,所以不要指望任何可移植性。
标签: c++ arrays pointers type-conversion endianness