如何在类型转换期间防止数据丢失?

时间:2013-03-02 19:32:04

标签: c

我试图使用fread作为

从文件中读取比特流
fread(buff, buffSize, 1, fp);

buff is the buffer to which i am reading 。 我正在阅读buffSize is the size of bufferfp is the file pointer。 将数据读入缓冲区后, 我试图将缓冲区内容强制转换为另一个strutsure varible。结构的形式为

typedef struct data
{
    char    id;
    short   value1;
    short   value2;
    ....
}data;

我做的是

data* var;
var = (data*)buff;

然后我尝试访问结构中的变量,如果比特流类似于00 b0 11 c1 00,如果是这样的话, var->id应为0x00var->value1应为0xb011var->value2应为0xc100

但我得到的是

var->id = 0x00;
var->value1 = 0x11c1;
...

为什么我没有达到预期的效果? 当我将第一个param类型更改为short时,值为var->id was 0x00b0。 最小访问权限大小是2 Bytes吗? 如何解决这个问题? 我只想阅读第一个字节到var->id字段。

1 个答案:

答案 0 :(得分:2)

这是因为在value1之前有一个padding field,用于对齐。如果你想摆脱它,请指示你的编译器“打包”结构。每个编译器都有不同的语法例如,在gcc上,您会说:

struct  __attribute__ ((__packed__)) data {
    /* ... */
};