2011-11-25 46 views
0

我有一个奇怪的问题,当我做了一个PWRITE结构到一个文件中。它在结构中的一个char条目旁边添加一个单字节。当我试图单独将char写入文件时,它正确写入了一个字节。有人可以告诉我为什么单个字节被添加?;额外的字节得到写入文件

int main(){ 

    typedef struct pcap_hdr_s { 
    guint32 magic_number; /* magic number */ 
    guint16 version_major; /* major version number */ 
    guint16 version_minor; /* minor version number */ 
    gint32 thiszone;  /* GMT to local correction */ 
    guint32 sigfigs;  /* accuracy of timestamps */ 
    guint32 snaplen;  /* max length of captured packets, in octets */ 
    guint32 network;  /* data link type */ 

    guint32 ts_sec;   /* timestamp seconds */ 
    guint32 ts_usec;  /* timestamp microseconds */ 
    guint32 incl_len;  /* number of octets of packet saved in file */ 
    guint32 orig_len;  /* actual length of packet */ 

    guint16 fcf; 
    char seqno; 
    guint16 dpan; 
    guint16 daddr; 
    guint16 saddr; 
    gint16 payload_data; 
    } pcaprec_hdr_t; 

    pcaprec_hdr_t packet_header; 

    packet_header.magic_number  =  PCAP_MAGIC; 
    packet_header.version_major  =  2; 
    packet_header.version_minor  =  4; 
    packet_header.thiszone   =  0; 
    packet_header.sigfigs   =  0; 
    packet_header.snaplen   =  65535; 
    packet_header.network   =  195; 

    struct timeval tv; 
    gettimeofday(&tv, NULL); 

    packet_header.ts_sec   =  tv.tv_sec; 
    packet_header.ts_usec   =  tv.tv_usec; 
    packet_header.incl_len   =  11; 
    packet_header.orig_len   =  13; 

    packet_header.seqno = 255; 
    packet_header.dpan = 65535; 
    packet_header.daddr = 65535; 
    packet_header.saddr = 65535; 
    packet_header.payload_data = 8; 

    int fd = open("sample.cap", O_CREAT | O_WRONLY); 
    printf("Bytes written: %d \n",pwrite(fd, &packet_header, sizeof(packet_header),0)); 

    } 

的结构有一个char变种“序列”和旁边的序列编号值随机值的单字节的文件中被添加。

+2

听起来像一个对准/结构包装问题。 – blueshift

回答

6

你的结构包含一个char数据成员,你可能有字对齐。看看你是否能在编译器中找到“pack”选项。

你或许可以使用#pragma pack(1)或类似编译(编译的是具体实施)更改为一组特定的类对齐。

不过要小心,编译器字对齐的性能的原因。内存总线通常在字边界上工作,因此您可能最终需要对跨越字边界的每个字进行两次提取,从而使存储访问变慢一点。

你可能想,如果你关心的文件中所添加的字节结构成员中流了出来独立。

+0

嗨,谢谢你的回应。当我一个一个地写信给我时,它工作得很好。所以你可以多告诉我一些关于“pack”选项的信息。我在gcc中查找了它,并且讨论了fpack-struct选项。但不知道这个选项是否值得。 – broun

+0

@Vijay:在gcc中,你可以用代码中的'#pragma pack(1)'来实现。这比使用编译器选项更好,因为它可以让你有选择性。在定义你的类之后,你必须用'#pragma pack()'将它设置回前面的值。这是非常重要的,这样您就不会让对齐流入其他头文件并更改其包设置。 –