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...