怎麼計算這個checksum
這個是上次有人發的一個招聘資訊裡的面試題, 資訊詳細和網路資料包格式如下, 對於其中的 checksum 不得其解, 哪位高手能解釋一下嗎。
0 4 8 12 +--------+--------+------+=============+ |SEQUENCE|CHECKSUM|LENGTH| DATA | +--------+--------+------+=============+
SEQUENCE 資料包序號(大端序) CHECKSUM (校驗和) 32 位校驗和,計算方式如下:首先將序號和資料拼接在一塊,然後以 32 位為塊,進行迭代異或操作。 第一次迭代時,將第一塊(資料包序號)與第二塊進行異或,第二次迭代時,將第三塊與上次迭代的結果進行異或,以此反覆。 如果 LENGTH 不是 4 的整數倍,需要用 0xAB 填充。 LENGTH 資料片段長度(大端序) DATA 長度為 LENGTH 資料片段
自己寫的 checkSum 函式如下, 沒有成功, 我可能理解錯誤:
func checkSum(msg []byte) bool {
var (
sum uint32
index int = 0
)
if len(msg) <= 12 {
return false
}
seqbuf := bytes.NewReader(msg[0:4])
var seq uint32
err := binary.Read(seqbuf, binary.BigEndian, &seq)
if err != nil {
log.Fatal("binary read error ", err)
}
var dataLen uint32
err := binary.Read(seqbuf, binary.BigEndian, &dataLen)
if err != nil {
log.Fatal("binary read error ", err)
}
length := int(dataLen)
bufReader := bytes.NewReader(msg[4:8])
var checksum uint32
err = binary.Read(bufReader, binary.BigEndian, &checksum)
if err != nil {
log.Fatal("binary read error ", err)
}
/*
if length%4 != 0 {
msg = bytes.Join([][]byte{msg, []byte{0xAB}}, nil)
}
*/
padLen := 4 - length%4
for ; padLen > 0; padLen-- {
msg = append(msg, 0xAB)
}
data := bytes.Join([][]byte{msg[0:4], msg[12 : 12+length]}, nil)
sum = seq ^ uint32(data[index+1])
index += 2
length -= 2
for length > 1 {
sum ^= uint32(data[index])
index += 1
length -= 1
}
if length > 0 {
sum ^= uint32(data[index])
}
//sum += (sum >> 16)
if sum != checksum {
return false
}
return true
}
更多原創文章乾貨分享,請關注公眾號
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- 怎麼進入雲端計算這個行業?新手怎麼學習雲端計算?行業
- 怎麼進入雲端計算這個行業?行業
- 計算校驗和工具:Checksum Thing MacMac
- 計算檔案Checksum的幾種方法
- 怎麼進入雲端計算這個行業?雲端計算學習路線推薦行業
- 累計預扣法個稅,怎麼算?(附excel)Excel
- 雲端計算的就業前途怎麼樣?這套雲端計算教程限時領就業
- word公式怎麼計算 word公式計算的方法公式
- 大模型時代,綠色計算這條路該怎麼走?大模型
- 求助!有大佬會計算這個嗎
- excel怎麼自己輸入公式計算 excel怎麼編輯函式進行計算Excel公式函式
- 雲端計算這個行業前景如何?行業
- 雲端計算就業前景怎麼樣?linux雲端計算怎麼開始學習就業Linux
- 【雲端計算】雲端計算四個必學知識看這裡!
- 以太坊gas是什麼?gasprice怎麼計算?
- MongoDB 怎麼計運算元查詢MongoDB
- 雲端計算為什麼這麼火?學習雲端計算費用是多少?
- 雲端計算的未來怎麼發展?怎麼學習雲端計算相關技術?
- 我就想加個索引,怎麼就這麼難?索引
- Laravel Dingo API 請求 到返回的整個耗時 怎麼計算?LaravelGoAPI
- 7.44CHECKSUM
- Attachment 這個外掛怎麼用啊?
- JAVA中計算兩個日期時間的差值竟然也有這麼多門道Java
- 2. 計算機怎麼表示數字計算機
- Uiautomator swipe 中滑動速度怎麼計算?UI
- 雲端計算開發是什麼?雲端計算的就業前途怎麼樣?就業
- win10計算器應用商店我們這裡出錯怎麼解決Win10
- 小白怎麼學習雲端計算?雲端計算學習大綱
- 學習雲端計算怎麼入門,如何學習雲端計算?
- 新股中籤率怎麼算?新股中籤率計算公式公式
- 怎麼使用圖片管理這個外掛
- 怎麼設計出一個簡約藝術感海報?這個PS設計教程很詳細!
- 雲端計算:雲端計算是怎麼分類的?
- BIRT 中組內跨行計算和小計怎麼做
- win10附件裡沒有計算器怎麼回事 win10 附件沒有計算器怎麼解決Win10
- 雲端計算和大資料那個專業好?雲端計算行業未來發展怎麼樣?大資料行業
- Mac計算器的計算過程怎麼看?教你一鍵檢視運算記錄!Mac
- 2019年個稅怎麼報,據說90%的人都員工的個稅計算錯了!