gpt4 book ai didi

c++ - 通过更改窗口大小获得不同的标题大小

转载 作者:可可西里 更新时间:2023-11-01 18:26:06 29 4
gpt4 key购买 nike

我有一个将 TCP header 表示为结构的 C++ 程序:

#include "stdafx.h"

/* TCP HEADER

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

*/

typedef struct { // RFC793
WORD wSourcePort;
WORD wDestPort;
DWORD dwSequence;
DWORD dwAcknowledgment;
unsigned int byReserved1:4;
unsigned int byDataOffset:4;
unsigned int fFIN:1;
unsigned int fSYN:1;
unsigned int fRST:1;
unsigned int fPSH:1;
unsigned int fACK:1;
unsigned int fURG:1;
unsigned int byReserved2:2;
unsigned short wWindow;
WORD wChecksum;
WORD wUrgentPointer;
} TCP_HEADER, *PTCP_HEADER;


int _tmain(int argc, _TCHAR* argv[])
{
printf("TCP header length: %d\n", sizeof(TCP_HEADER));
return 0;
}

如果我运行这个程序,我得到这个 header 的大小为 24 个字节,这不是我期望的大小。如果我将字段“wWindow”的类型更改为“unsigned int wWindow:16”,它与 unsigned short 具有相同的位数,程序会告诉我结构的大小现在是 20 个字节,这是正确的大小。这是为什么?

我在 32 位 x86 机器上使用带有 SP1 的 Microsoft Visual Studio 2005。

最佳答案

因为编译器将您的位域打包为 32 位 int,而不是 16 位实体。

一般来说,您应该避免使用位域并使用其他具有显式位掩码和移位的 list 常量(枚举或其他)来访问字段中的“子字段”。

这是应避免使用位域的原因之一 - 即使对于同一平台,它们在编译器之间的可移植性也不是很好。来自C99标准(C90标准中有类似的措辞):

An implementation may allocate any addressable storage unit large enough to hold a bitfield. If enough space remains, a bit-field that immediately follows another bit-field in a structure shall be packed into adjacent bits of the same unit. If insufficient space remains, whether a bit-field that does not fit is put into the next unit or overlaps adjacent units is implementation-defined. The order of allocation of bit-fields within a unit (high-order to low-order or low-order to high-order) is implementation-defined. The alignment of the addressable storage unit is unspecified.

你不能保证一个位域是否会“跨越”一个 int 边界,你也不能指定一个位域是从 int 的低端开始还是从 int 的高端开始(这与是否处理器是大端还是小端)。

关于c++ - 通过更改窗口大小获得不同的标题大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/149995/

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