Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c语言中从文件中检索头_C_File_Bit Fields - Fatal编程技术网

在c语言中从文件中检索头

在c语言中从文件中检索头,c,file,bit-fields,C,File,Bit Fields,我有一个文件,我想从中检索头文件,头文件按网络顺序排列(big-endian),我想将其存储在以下结构中: struct record { unsigned int type : 15; unsigned int f : 1; unsigned int length : 16; char* payload; unsigned int uuid: 32; }; 我只想存储32位长的标题。它有三个部分,按以下顺序排列:类型、页脚和长度。它们

我有一个文件,我想从中检索头文件,头文件按网络顺序排列(big-endian),我想将其存储在以下结构中:

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)            |
+------------------------------+
标头按网络顺序排列(大端)

如何将这些值存储在结构的位字段中

正如我所理解的:

    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];
struct记录输出;
无符号字符字节[4];
fread(字节,sizeof(字节),1,文件);//读取前4个字节
//将4个字节转换为您想要的值。
output.type=字节[0]>1;
output.f=字节[1]&0x1;

output.length=字节[2]请发布一个示例文件,可能有一个位字段被明确指定。具体来说,您无法确定字段的顺序。可以保证的是,系统本身是一致的,但是如果你想交换消息,你最好避免它们……那么,你知道从哪里开始吗?你打开文件了吗?读取4个字节?你有什么具体的问题?从文件中读取4个字节,将其转换为要存储在位字段中的值,获取文件大小减去4个字节,将文件的其余部分读取为动态分配的有效负载,读取最后4个字节并将其存储在uuid中。
fread(&header,sizeof(uint32_t),1,f)否,不要将其读入单个值,按字节操作。你读了4个字节。然后将4个字节转换为您想要的值。接下来是:
无符号字符字节[4];fread(字节,…);type=0xafff&(bytes[0]>7;length=bytes[3]@KamilCuk在我的例子中,对于fread函数,我应该有这样的东西?
fread(bytes,sizeof(char),4,f);
i,不幸的是,我有big-endian中的值,但在结构中我必须转换为little-endian如何转换?
output.type=(bytes[0]>1)
@a_fuzzle_student
在这个结构中,我必须转换成小尾端,我没有遵循。这个结构如何保持并不相关——它保持一个“值”——一个数字。
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];