RTP頭的解析及大小端處理的細節

2021-08-26 20:45:52 字數 1225 閱讀 2277

在看如何解析rtp頭之前,先複習下大端和小端的概念,再分析如何解析rtp頭

大小端是不同的cpu架構對記憶體的使用方式不同,將最高有效位元組放在記憶體的低位,為大端序,在最高有效位元組放在記憶體的高位,為小端序。在之前本以為大端和小端只是針對的多位元組,其實在乙個位元組內的位元序也有大小端的概念,這裡列兩個結論

進製書寫中,最高位在最左端,最低為在最右端(相當於記憶體順序)。所有的網路協議都是以大端序(多位元組序和位元序)來定義。在x86下是小端(多位元組序和位元序)。乙太網中是以小端來傳送位元,傳送時現轉換為小端,接收時網絡卡會將位元序轉換位本機的位元序,所以位元序的轉換是在網絡卡上處理的,應用層無需關心,見下面參考資料1的描述這篇文章詳細的解釋了多位元組及位元序的大小端

這篇文章詳細介紹了位元序

可以看到協議的定義是以大端順序定義的

按照rtp header的定義,定義如下位域結構體

struct mbrtpheader

;

位域結構體中定義了乙個rtp_big_endian巨集,用來標識系統是否是大端,如果系統是大端那麼位域(位元序)的定義就是按照協議中的字段順序來定義。如果是小端,應該是按照協議中相反的順序來定義。以下是解析示例**,以小端為例:

void processrtpheader(unsigned char* pdata)

在上面的**示例中,取sequencenumber和ssrc時需要注意,因為其為多位元組,所以需要轉換為本地位元組序(小端多位元組序)後,再取值。

定義如下結構體

struct rtpheader

;

void processrtpheader(unsigned char* pdata)

int rbe16(const unsigned char *p)

int rbe32(const unsigned char *p)

顯然通過位域結構體解析rtp header還是簡單很多

這裡介紹了解析rtp header時對多位元組序及位元序的大小端處理所應注意的細節,可以擴充套件開去,解析其它協議也應注意大小端的處理的不同。

mysql 大小端 CPU的大小端及如果判斷

不同體系結構的cpu,資料在記憶體中存放的排列順序是不一樣的。儲存器中對資料的儲存是以位元組 byte 為基本單位的,因此,字 word 和半字 half word 在儲存器中就有兩種次序,分別稱為 大端模式 big endian 和小端模式 little endian 大端儲存模式是指字或半字的最...

C語言 溢位的處理及大小端模式的判斷

我們都知道,字元char型別,占用的空間為8位,int型別占用空間為16位,當int賦值給char的時候會發生什麼效果呢?處理規則是什麼樣的呢?方法一 編寫如下 測試 include include int main 如果賦值之後,將保留高位位元組,捨棄低位位元組,將列印出13h 相反,如果保留低位...

大小端的判斷及轉換

大端模式 是指資料的高位元組儲存在記憶體的低位址中,而資料的低位元組儲存在記憶體的高位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理 位址由小向大增加,而資料從高位往低位放 這和我們的閱讀習慣一致。小端模式 是指資料的高位元組儲存在記憶體的高位址中,而資料的低位元組儲存在記憶體的低位址中,這...