SOCKET 封包 和 解包

2021-09-29 20:20:47 字數 2118 閱讀 7384

soecet收發資料封包和解包

一般都有固定長度、固定字尾等做法,但都花裡胡哨,有各自的問題。

本文採用資料長度+資料buffer模式,其中最簡單的是用4位元組int來表示長度。但這還不夠,很多情況下長度可能乙個byte就夠用了,浪費了3個位元組,本文採用動態位元組數來儲存長度,至於資料buffer使用protobuf來編碼和解碼就完事了

首先讀取乙個位元組,也就8個bit,a b c d e f g h

判斷a是否為0,如果是,則長度用1個位元組0*** ***x表示,那麼1個位元組能表示的範圍是[0, 128 ),

a=1,繼續判斷b是否為0,如果是,長度用2個位元組10xx ***x ***x ***x表示,2個位元組表示的範圍是[128, 16k )

a=1,b=1,繼續判斷c是否為0,如果是,長度用3個位元組表示110x ***x ***x ***x ***x,3個位元組表示的範圍是[16k, 2m )

a=1,b=1,c=1,此時長度用4個位元組表示111x ***x ***x ***x ***x ***x ***x ***x,4個位元組表示的範圍是[2m, 512m )

首位元組型別

需要位元組數

範圍16進製制最大值(不包含)

0*** ***x

1[0, 128)

0x80

10xx ***x

2[128, 16k)

0x4000

110x ***x

3[16k, 2m)

0x200000

111x ***x

4[2m, 512m)

0x20000000

其實絕大部分包的大小是128位元組以內,那麼將會用1個位元組來表示長度,相對原始方案,節省了3個位元組

長度編碼

/// 

/// 設定乙個byte中各個bit的位值

///

/// 目標,要設定的byte

/// 值,為目標位設定的值

///

public

static

byte

setbits

(byte _word,

byte

value

)///

/// 0*** ***x [0-128) 1個位元組

/// 10xx ***x [128, 16k) 2個位元組

/// 110x ***x [16k, 2m) 3個位元組

/// 111x ***x [2m, 512m) 4個位元組

///

///

///

public

static

byte

encodeint

(int

value)"

,value))

;}elseif(

value

<

0x80);

}elseif(

value

<

0x4000);

}elseif(

value

<

0x200000);

}elseif(

value

<

0x20000000);

}else

), cur_length()"

,0x20000000

,value))

;}}

長度解碼

public

static

intdecodeint

(byte

data,

int offset,

int count,

outint lengthbytecount)

elseif(

(data[offset]

&0x40)==

0)//10xx ***x

elseif(

(data[offset]

&0x20)==

0)//110xx ***x

else

//111x ***x

}}

資料封包解包協議之TCP封包解包

資料封包協議規定 整個資料報包含2位元組長度資訊 資料報體。2位元組長度資訊包含本身著2位元組。如 資料體是 abcdefg 7個位元組,整體封包就是09abcdefg,總共是9個位元組的協議 1 netbus接收到資料後傳送到static void on recv tcp data uv sess...

解包kwargs python的封包與解包

將多個值賦值給乙個變數時,python會自動將這些值封裝成元組,這個特性稱之為封包 a 1,2,3 print a,type a 1,2,3 當函式返回多個數值時,也會進行封包 def test return 1,2,3 a test print a,type a 1,2,3 實踐中,很少主動使用封...

序列封包和序列解包

程式把多個值賦給乙個變數時,python會自動將多個值封裝成元組,這種功能被稱為序列封包 程式允許將序列 元組或列表等 直接賦值給多個變數,此時序列的各元素會被一次賦值給每個變數,要求序列元素個數和變數個數相等 這種功能被稱為序列解包。a 1,2,3,4 a 1,2,3,4 type a x,y,z...