網路傳輸-數據結構

引言

在進行網絡傳輸的時候,常常會定義協議的書庫類型,json,還是結構體。
下面就說說其中要注意的事項

結構體的長度

如何獲取結構體的長度

struct MyStruct
{
	int a;
	int b;
	int c;
};
	MyStruct m;
	int len = sizeof(m);
	std::cout << len << std::endl;
// 輸出 是 12 ,(每個int的長度是4)

類的長度

MyClass::MyClass()
{
}
	MyClass m;
	int len = sizeof(m);
	std::cout << len << std::endl;
// 輸出 是 1 ,(空類的長度是1)

std::string

std::string str="123456789";
int len = sizeof(str);
std::cout << len << std::endl;
// 輸出是 28 

在使用VS2015的32位debug構建中,sizeof(std::string)返回28;在64位debug構建中,得到40;在32位release構建中,得到24,在64位release構建中,得到32。
這是因爲std::string的內部表示隨不同的構建選項而變化:例如,調試構建通常包含額外的機制以幫助發現bug,這會增加表示的大小;此外,在64位構建中,指針更大,所以大小相對32位構建的要大點。

std::string str="123456789";
std::cout << str.length() << std::endl;
// 輸出是 9 

輸出是 字符串的長度

注意

struct MyStruct
{
	int a;
	int b;
	int c;
	std::string str;
};

按照上面的方式定義結構體,在網絡傳輸中,由於str長度的不確定,在解析的時候,會出現問題。
所以要使用定常的數據類型比如

struct MyStruct
{
	int a;
	int b;
	int c;
	char[256]
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章