前置过滤:就是放在函数前面的 剔除一些不满足处理条件的情况
案例1
原始LOG
pack {1111 0200 1501 0D0A}
pack {1012 1000 DF5F35875BBC 14 00 80570023 E7DCDE9D 0D0A}
pack {0000 0000 00 0000}
Invaild pack length, data:00
查询原因是:
cloud发送消息以后 不可避免多发一个全部为0的数据包!
非常迷糊吧 那就我们自己接收端主动丢弃吧!
LOG的输出是在这里
func ParseByteArray(b []uint8) (PACK_DATA, error) {
var p PACK_DATA
if len(b) <= 6 {
return p, errors.New("Invaild pack length")
}
其实可以前置 也就是不必惊动这个函数 提前就丢弃!
ws是在连接的时候设置的
m_ws.Connect
go ReadMsg(disconn, ws_conn, bin_callback, text_callback)
此时真相大白
if msg_type == websocket.TextMessage {
log.Printf("[m_ws] Recv: %s\r\n", string(message))
if text_callback != nil {
binary_data, err := b64.StdEncoding.DecodeString(string(message))
if err != nil { // Base64 parse failed, means this data is not binary type.
text_callback(string(message))
} else {
if len(binary_data) > 6 {
callback(binary_data)
}
}
}
}
案例2:
过来一帧数据 处理
pack, err := ParseByteArray(binary_data)
解释一下
pack, err :是函数的返回值 参数1 是我们自己定的结构体
type PACK_DATA struct {
Cmd [2]uint8
Data_len [2]uint8
Data []uint8
End_byte [2]uint8
}(它其实是T-L-V在追加的TAIL是\R\N 不是很好吧 看上去)
传入的参数是 []byte 是B64解析的网络数据
进入函数看看
func ParseByteArray(b []uint8) (PACK_DATA, error) {
var p PACK_DATA
if len(b) <= 6 {
return p, errors.New("Invaild pack length")
}
if b[len(b)-2] != 0x0D && b[len(b)-1] != 0x0A {
return p, errors.New("Invaild end bytes")
}
copy(p.Cmd[:], b[0:2])
copy(p.Data_len[:], b[2:4])
datalen=b[2]
p.Data = b[4:(len(b) - 2)]
arraylen=len(b)-2-4
if(arraylen!=datalen){
return p, errors.New("Invaild pack TLV")
}
copy(p.End_byte[:], b[len(b)-2:len(b)])
return p, nil
}
他就是把b []uint8 切割为结构体!主要是copy
这里面的放错 有一个遗漏
1----长度必须是>6 因为结构体定义了---ok
2---结尾尾巴必须是\R\N----ok
2---自洽描述的长度Data_len和真正的Data[]需要一样多---fail
现在是在后面写的函数
pack, err := ParseByteArray(binary_data)
pack_len := *(*uint16)(unsafe.Pointer(&(pack.Data_len)))---就是强转U8[2]为U16
log.Printf("[BG] pack_len=%d\r\n", pack_len)
if pack_len != uint16(len(pack.Data)) {-----len(pack.Data)求一个数组的长度
log.Printf("[BG] Data length not equal\r\n")
break
}
前置 放在函数里面 不是很好吗
这样还不如就写在前面的函数里面 del这里
func ParseByteArray(b []uint8) (PACK_DATA, error) {
var p PACK_DATA
if len(b) <= 6 {
return p, errors.New("Invaild pack length")
}
if b[len(b)-2] != 0x0D && b[len(b)-1] != 0x0A {
return p, errors.New("Invaild end bytes")
}
copy(p.Cmd[:], b[0:2])
copy(p.Data_len[:], b[2:4])
datalen := int(b[3]<<8 | b[2])
p.Data = b[4:(len(b) - 2)]
arraylen := len(b) - 2 - 4
fmt.Println(arraylen, datalen, b[2], b[3], "--------------")
if arraylen != datalen {
return p, errors.New("Invaild pack TLV")
}
copy(p.End_byte[:], b[len(b)-2:len(b)])
return p, nil
}