怎麼計算這個checksum

kggg發表於2018-08-08

這個是上次有人發的一個招聘資訊裡的面試題, 資訊詳細和網路資料包格式如下, 對於其中的 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
}

更多原創文章乾貨分享,請關注公眾號
  • 怎麼計算這個checksum
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章