Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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 从EFS读取的压缩结构给出了奇怪的结果_C_Packed - Fatal编程技术网

C 从EFS读取的压缩结构给出了奇怪的结果

C 从EFS读取的压缩结构给出了奇怪的结果,c,packed,C,Packed,我创建了一个EFS项,它具有以下结构 struct { uint8 version; // uint8 - 1 byte data type, uint16 - 2 byte uint16 y1; uint16 y2; uint16 y3; uint8 reserved[9]; } 现在EFS文件的大小是16字节,所以我认为它是打包的 现在我有了相同的结构,通电后我从EFS读取值,但编译器返回的结构大小是18字节(编译器不支持打包,所以EFS读取失

我创建了一个EFS项,它具有以下结构

struct 
{
    uint8 version;   // uint8 - 1 byte data type, uint16 - 2 byte
    uint16 y1;
    uint16 y2;
    uint16 y3;
    uint8 reserved[9];
}
现在EFS文件的大小是16字节,所以我认为它是打包的

现在我有了相同的结构,通电后我从EFS读取值,但编译器返回的结构大小是18字节(编译器不支持打包,所以EFS读取失败)

我只读了16字节,它就通过了

问题:

(1) 。如果我只读取16字节,是否存在数据丢失的风险,因为在第一个成员之后,我的结构中将有一个字节填充空间(因为我的编译器不支持压缩结构,我无法使用它) 我将以下值写入EFS

version -0
y1      -6
y2      -10
y3      -60
我只读取了16个字节,结构中的每个成员都被分配了正确的值。是否存在我的结构有错误值的情况

(2) 。由于第一步的混乱,我创建了一个临时结构,如下所示

struct
{ 
    uint8 version;
    uint8 y1_a;
    uint8 y1_b;
    uint8 y2_a;
    uint8 y2_b;
    uint8 y3_a;
    uint8 y3_b;
    uint8 reserved[9];
}
现在EFS和结构大小都是16字节, 现在,当我将输入作为 版本=0,y1=6,y2=10,y3=60

成员的赋值如下:version=0,y1_a=6,y1_b=0,y2_a=10,y2_b=0, y3_a=60,y3_b=0

有人能帮助理解这一点吗?
我的想法是读入temp结构(这样EFs和我的结构的大小都是相同的),然后从temp结构中为我的原始结构赋值。我假设您只需将字节从EFs复制到结构中即可读取数据

(如果您这样填写您的结构:

read(&(s.version)...);
read(&(s.y1)...);
当然,对于打包或解包结构,您没有任何问题……但是您必须确保以相同的方式进行编写。)

根据编译器的不同,EFS读取的数据肯定无法正确分配

要检查编译器如何完成打包,我将进行两个测试:

int a = ((int)&(s.y1)) - ((int)&(s.version));
如果编译器进行打包,则为1,否则为2

union {
    struct {
        uint8 version;
        uint16 y1;
        ...
    } unsure;
    struct {
        uint8 version;
        uint8 y1_a;
        uint8 y1_b;
        ...
    } definitely_unpacked;
}

这个联合体应该可以让您更详细地了解正在发生的事情:当将数据读入联合体时,您可以看到第二个结构中的哪个uint8将映射到第一个结构中的哪个uint16。

您使用的编译器是什么?什么处理器?这是针对嵌入式系统的吗?什么操作系统?是的,它的嵌入式系统,安卓,编译器在不同的版本(取决于不同的产品)中有所不同,你们可能会注意到它的顺序问题。你可能会找到你想要的答案。是的,我也认为它的endian问题,但问题是,当我直接读取我的主结构时,读取是正确的(例如版本0、y1 6、y2 10和y3 60),现在因为我的EFS已打包,而结构未打包,所以在我的结构中的版本后会添加一个额外的字节。不应该正确读取y1。[原因]临时结构中的6在y1_a中读取,y1_b为0。我需要一次读取整个数据,这是主要问题:(,这就是我使用临时结构的原因。