我有一个文件,我想从中检索头,头是在网络顺序(大端),我想把它存储在这个结构中:
struct record {
unsigned int type : 15;
unsigned int f : 1;
unsigned int length : 16;
char* payload;
unsigned int uuid: 32;
};
我只想存储32位长的头。它有三个部分,按以下顺序排列:类型、页脚和长度。它们的长度分别为15位、1位和16位。我想知道我应该如何将这些值存储在我的结构体的位域中。
我还需要找到消息中包含的字节/字节数(包含头)
注意:该文件包含一个连续的二进制消息,没有中断(从我所理解的)。
编辑:这是消息的格式:
0 15 16 31
+-------------+-+--------------+
|TYPE |F| LENGTH |
+------------------------------+
| |
PAYLOAD
+ +
| |
+------------------------------+
| (UUID) |
+------------------------------+
报头按网络顺序(大端序)
|TYPE |F| LENGTH |
我应该如何将这些值存储在结构体的位域中。
我的解释是:
v- most significant bit of first byte
v- least significant bit of first byte
|xxxxxxxxxxxxxxx|F| |
^- Least significant bit of "type"
^- Most significant bit of "type"
field "type" has 15 bits
从文件中读取字节,然后将字节转换为值。我认为这将是以下的东西,但我不确定bytes[1] >> 1
的东西:
struct record output;
unsigned char bytes[4];
fread(bytes, sizeof(bytes), 1, file); // read first 4 bytes
// Convert 4 bytes to values you want to have.
output.type = bytes[0] << 7 | bytes[1] >> 1;
output.f = bytes[1] & 0x1;
output.length = bytes[2] << 8 | bytes[3];