gpt4 book ai didi

c++ - 通过套接字 C++ 发送时位域值发生变化

转载 作者:行者123 更新时间:2023-11-28 01:41:17 28 4
gpt4 key购买 nike

我有一个如下所示的位域:

typedef struct __attribute__((__packed__)) MyStruct {
unsigned int val1:14;
unsigned int val2:1;
unsigned int val3:1;
unsigned int val4:1;
unsigned int val5:1;
unsigned short aFullShort;
unsigned int aFullInt;
} MyStruct;

我正在通过网络发送这些值,并注意到有时发送方会认为 val1 已设置(可通过在发送前打印值来验证)但接收方不会看到 val1 已设置。传输代码如下:

MyStruct* myStruct = new MyStruct(); //initialize fields here
sendto(sock, myStruct, sizeof(MyStruct), 0, ...);

读取代码如下:

unsigned char theBuffer[sizeof(MyStruct)];
recvfrom(aSocket, &theBuffer, sizeof(theBuffer), 0, ...);

从套接字读取字节后,我将字节重新解释转换为 MyStruct 并为 aFullShortaFullInt 执行字节序转换。当发送方将 val1 设置为 1 时,发生损坏,接收方认为 val1 为 0。为什么会发生这种情况?编译器可能会为发送方和接收方插入不同的填充吗?我需要担心单位值的字节顺序吗?

最佳答案

编译器可以根据需要布置位域。如果愿意,它可以在每次执行时将它们随机化。绝对没有禁止这样做的规则。如果您想以可信赖的可预测二进制格式序列化数据,请编写执行此操作的代码。

唯一的异常(exception)是,如果您的编译器对打包结构有一些特定的保证,并且您愿意将自己限制在该编译器上。您没有指定正在使用的编译器,但我怀疑它确实如此。

真的没有理由写这样的代码。您希望编写保证按照相关标准工作的代码,而不是在没有任何事情打破它所做的假设的情况下可能碰巧工作的代码。

关于c++ - 通过套接字 C++ 发送时位域值发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47042446/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com