基於Socket的十六進制數據解析思路分析

基於Socket的十六進制數據解析

數據解析的思路

基本思路

  1. 消息結構體,存儲從緩存中解析的數據; buffer
  2. 回調函數,從緩存中解析數據時調用;
  3. 循環隊列,用於緩存接收到的數據;
    關鍵實現:
  4. 把接收到的數據存儲到緩存中,並準備解析;
  5. 遞歸解析消息

客戶端和服務器端

  1. 首先定義一個類存放消息中包含的信息;是實體類;類中包括客戶端和服務端的兩種消息;
    或者客戶端和服務端分開寫兩個實體類存放消息;

  2. 根據一定的協議對其編解碼,定義一個interface,提供序列化和反序列化方法,
    (1)toWire()根據一個特定的消息,將消息轉換成字節序列;
    (2)formWire()根據相同的協議,對給定的字節序列解析,根據信息的內容返回一個消息類的實例;

  3. 實現接口的兩個類,一個基於文本的編碼方式,一個基於十六進制的編碼方式;

    • 基於文本的編碼方式:
      使用ASCII字符集對文本進行編碼,消息開頭是一個字符序列,用於快速將協議的消息和網 絡中隨機的垃圾消息區分開;
      對射發送/接收消息的布爾值,是否爲服務器發送響應消息,標記對射的ID,編碼成十進制;
      (1) toWire()簡單的創建了一個字符串,該字符串包含了消息的所有字段,並通過空白符隔開。
      (2)fromWire()首先檢查魔術字符串,如果在消息前沒有魔術字符串,則拋出一個異常。

    注意程序對來源與網絡的消息數據進行輸入!

  • 基於十六進制的編碼
    基於十六進制對消息進行編碼的程序,與文本編碼相反,十六進制使用固定大小的消息,每條消息由一個特殊的字節開始,該字節最高X位爲一個魔術值,該字節的哪幾位對布爾值進行了編碼,消息的哪幾個字節總是不變,消息的哪幾個字節是ID值,只有響應消息的哪幾個字節包含數據信息,字節序列的格式如下:
    <“id”><#acct>

其中 = [#acct|event gg zone ] or
當事件類型爲NULL/ACK/DUH時data段爲[]。當事件類型爲ADM-CID時data段格式爲[#acct|event gg zone];
第一個<#acct>爲主機賬號;
第一個<#acct>爲安定寶ID;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章