大小端位元組序與序列化

2021-10-09 17:19:57 字數 1824 閱讀 1766

這是一種更適合人類讀取資料的方式

舉個例子,有如下資料:

0x12345678

高—————>低 位

按8位為乙個位元組邏輯(byte進行網路傳輸時不需要進行網路位元組序轉換)把上面資料拆分成4部分:

0x12   0x34   0x56   0x78

從左到右:高位到低位

記憶方法:低高高低,這是一種便於人類讀取的方式。像120,百位十位個位,也是從高位到低位進行讀的:一百二十

從左到右:低位到高位

記憶方法:低低高高(對於大小端的記憶其實理解最為重要,理解後就可以很深刻的記住了)

計算機都是從低位開始計算的,所以計算機電路是先處理低位位元組的,效率也會高些。

計算機位元組序,通常都會使用小端位元組序,當然有些系統例外。

通常網路傳輸慣於使用大端位元組序,也就是人類習慣的一種位元組序。當然進行網路位元組序的轉換還有個目的是為了保證傳輸格式的統一。

因為雖然主機位元組序大多數使用小端位元組序,但是還是有一小部分的使用大端位元組序的,為了保證不同位元組序的兩台機子能夠進行通訊,則可以都先轉換為統一的網路位元組序進行資料的接收和傳輸。

如c++中的: htonl、ntohl等,都是進行位元組序的轉換。

前者主機位元組序到網路位元組序,後者網路位元組序到主機位元組序

#include // 判斷大端位元組序 方法一

bool isbigendian()

// 判斷小端位元組序 方法二:利用聯合體

union uendian

;bool islittleendianbyunion()

int main(void)

輸出結果如下:

fun1 is big endian *****==0

fun2 is little endian *****==1

從如上的輸出可以看出判斷大端位元組序返回的是false,而判斷小端位元組序返回的是true,由此可以證明我本地(macos)的位元組序為小端位元組序。

對於這兩者的概念,其實他們倆沒有直接的關係,挺多人可能會搞混,先搞清楚什麼是序列化?

序列化 (serialization)是將物件的狀態資訊轉換為可以儲存或傳輸的形式的過程

從我個人理解來看

如果學過計算機的童鞋都知道,其實計算機只能識別0跟1(乙個位元組就是八個0或1,對於c而言乙個位元組=乙個字元,多個字元就形成了字串;相比起數值啥的,他們只是多了個規定多少個位元組為乙個數值(語言層面上的東西,對於計算機來說它是不懂的),但他們本質是一樣的,只需要把數值轉換成多個位元組那麼計算機就可以識別了。)

目前的序列化協議其實挺多的,二進位製流、protobuf、xml、json等等,這些傳輸方式存在是為了讓變數啥的能夠通過某種邏輯轉換能傳輸到其他終端,再通過相反的邏輯進行解析,並在其他端可以使用。

總結:我們看到的形形色色的變數呀物件啥的,其實計算機是不認識的,所以這中間需要翻譯,那麼翻譯其實就是序列化/反序列化。

還不明白也不要緊,以下是使用二進位制的形式進行序列化,先來看看下面一段**就明白了。

void push(uint32 val)

// 這裡省略了一些呼叫

}

如有說的不對的地方,歡迎批評指錯~

大小端位元組序

1.大端和小端問題 大小端位元組序與硬體有關 intel x86 都是小端位元組序 總結 大端是 按照正常我們書寫的順序來儲存的 小端是 按照我們書寫順序相反的 實現 include int main putchar n printf x n a return 0 檢視輸出結果,判斷大小端位元組序 ...

位元組序 大小端

計算機的基本儲存單元是8位單位元組。多位元組資料,如4位元組的整型資料如何儲存的呢?是高位在記憶體高位元組?還是低位在記憶體高位元組?即位元組是按如何順序存放的?也就是所謂的位元組序,按照存放順序分為大端序 big endian 和小端序 little endian 記憶體位址訪問是由低位址到高位址...

大小端位元組序

計算機硬體有兩種儲存資料的方式 大端位元組序 big endian 和小端位元組序 little endian 比如十六進製制數0x0102,十六進製制每個數字佔4bit,四個數字16bit,也就是2byte,2個位元組儲存。0x0102高位位元組是0x01,低位位元組是0x02。l大端位元組序 高...