通过线路发送Big Endian格式化二进制文件

时间:2013-07-02 21:01:55

标签: c network-programming endianness

之前我正在组播这样的事情:

struct Message
{
    char     cat[3];
    uint64_t foo;
    uint16_t bar;
} __attribute((packed));

Message MESSAGE;

int main(void)
{
    //every now and then
    memcpy(MESSAGE.cat, bla, 3);
    MESSAGE.foo = varA;
    MESSAGE.bar = varB - varC;

    sendto(fd, &MESSAGE, sizeof(MESSAGE), 0, &sockAddr, sizeof(sockAddr));
}

接收方的声明是,即使foo没问题,他们也会收到消息,barcat也会被扰乱。并且他们期望Big Endian获得积分值。所以我改变了我的代码来做到这一点:

int main(void)
{
    //every now and then
    memcpy(MESSAGE.cat, bla, 3);
    MESSAGE.foo = bswap_64(varA);
    MESSAGE.bar = varB - varC;
    MESSAGE.bar = bswap_16(MESSAGE.bar);

    sendto(fd, &MESSAGE, sizeof(MESSAGE), 0, &sockAddr, sizeof(sockAddr));
}

并且索赔仍然相同。这怎么可能? Big vs Little endian是二进制的,如果不是之前的话。或者上面的逻辑有什么问题吗?

2 个答案:

答案 0 :(得分:1)

您需要查找http://linux.die.net/man/3/ntohl

将内容转换为网络顺序然后重建。

答案 1 :(得分:0)

尝试在发送之前将数据包保存到文件中 - 这样您就可以检查它。