Last active
January 18, 2022 14:15
-
-
Save iyear/b580a87c1a76c564c77783e02b98a364 to your computer and use it in GitHub Desktop.
企鹅电竞模拟 js 实现 websocket 二进制数据解析(未完成)后续使用 goja 直接运行魔改后的js实现
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
type D struct { | |
Data []byte | |
} | |
type M struct { | |
Tag uint8 | |
Type uint8 | |
Val interface{} | |
Pos int | |
Ext int | |
} | |
type I struct { | |
Val interface{} | |
LastPos int | |
Ext int | |
Tag uint8 | |
} | |
func (d *D) v() error { | |
start := uint32(18) | |
end := binary.BigEndian.Uint32(d.Data[0:4]) | |
op := binary.BigEndian.Uint16(d.Data[8:10]) | |
seq := binary.BigEndian.Uint32(d.Data[10:14]) | |
fmt.Println(start, end, op, seq, len(d.Data)) | |
if int(end) != len(d.Data) { | |
return errors.New("the received packet length is abnormal") | |
} | |
} | |
func (d *D) w(op uint16, start, end uint32) { | |
} | |
func (d *D) x(start, end uint32) { | |
i := binary.BigEndian.Uint32(d.Data[start : start+4]) | |
n := d.Data[start:end] | |
if len(n) >= int(i+4) { | |
// o:=n[4:4+i] | |
// a:=d.s(o,0) | |
} | |
} | |
func (d *D) ye() { | |
} | |
func (d *D)t() { | |
} | |
func (d *D) s(data []byte, pos int) ([]I, []byte) { | |
i := make([]I, 0) | |
n := len(data) | |
tpos := pos | |
for pos < n { | |
o := d.m(data, tpos) | |
i = append(i, I{ | |
Val: o.Val, | |
LastPos: o.Pos, | |
Ext: o.Ext, | |
Tag: o.Tag, | |
}) | |
tpos = o.Pos | |
} | |
return i, data | |
} | |
func (d *D) m(data []byte, pos int) M { | |
a := data[pos] | |
tag := (240 & a) >> 4 | |
tp := 15 & a | |
spos := pos + 1 | |
var val interface{} | |
var rpos, ext int | |
switch tp { | |
case 0: | |
val, rpos = d.f0(data, spos) | |
case 1: | |
val, rpos = d.f1(data, spos) | |
case 2: | |
val, rpos = d.f2(data, spos) | |
case 3: | |
val, rpos = d.f3(data, spos) | |
case 4: | |
val, rpos = d.f4(data, spos) | |
case 6: | |
val, rpos, ext = d.f6(data, spos) | |
case 7: | |
val, rpos, ext = d.f7(data, spos) | |
case 8: | |
val, rpos = d.f8(data, spos) | |
case 9: | |
val, rpos = d.f9(data, spos) | |
case 12: | |
val, rpos = d.f12(data, spos) | |
case 13: | |
val, rpos = d.f13(data, spos) | |
} | |
return M{ | |
Tag: tag, | |
Type: tp, | |
Val: val, | |
Pos: rpos, | |
Ext: ext, | |
} | |
} | |
func (d *D) f0(data []byte, pos int) (uint8, int) { | |
return data[pos], pos + 1 | |
} | |
func (d *D) f1(data []byte, pos int) (uint16, int) { | |
return binary.BigEndian.Uint16(data[pos : pos+2]), pos + 2 | |
} | |
func (d *D) f2(data []byte, pos int) (uint32, int) { | |
return binary.BigEndian.Uint32(data[pos : pos+4]), pos + 4 | |
} | |
func (d *D) f3(data []byte, pos int) (uint64, int) { | |
e := data[pos : pos+8] | |
i := (uint64(e[0]) << 24) + (uint64(e[1]) << 16) + (uint64(e[2]) << 8) + uint64(e[3]) | |
o := (uint64(e[4]) << 24) + (uint64(e[5]) << 16) + (uint64(e[6]) << 8) + uint64(e[7]) | |
value := (i << 32) + o | |
return value, pos + 8 | |
} | |
func (d *D) f4(data []byte, pos int) (float32, int) { | |
return math.Float32frombits(binary.BigEndian.Uint32(data[pos : pos+4])), pos + 4 | |
} | |
func (d *D) f5(data []byte, pos int) (float64, int) { | |
return math.Float64frombits(binary.BigEndian.Uint64(data[pos : pos+8])), pos + 8 | |
} | |
func (d *D) f6(data []byte, pos int) ([]byte, int, int) { | |
n := data[pos] | |
start := pos + 1 | |
end := start + int(n) | |
return data[start:end], end, start | |
} | |
func (d *D) f7(data []byte, pos int) ([]byte, int, int) { | |
n := binary.BigEndian.Uint32(data[pos : pos+4]) | |
start := pos + 4 | |
end := start + int(n) | |
return data[start:end], end, start | |
} | |
func (d *D) f8(data []byte, pos int) (map[int]int, int) { | |
i := make(map[int]int) | |
b := d.m(data, pos) | |
o := b.Val.(int) | |
r := b.Pos | |
for o > 0 { | |
a := d.m(data, r) | |
s := d.m(data, a.Pos) | |
if a.Tag == 0 && s.Tag == 1 { | |
i[a.Val.(int)] = s.Val.(int) | |
} | |
r = s.Pos | |
o-- | |
} | |
return i, r | |
} | |
func (d *D) f9(data []byte, pos int) ([]M, int) { | |
r := make([]M, 0) | |
i := d.m(data, pos) | |
n := i.Val.(int) | |
o := i.Pos | |
for n > 0 { | |
a := d.m(data, o) | |
r = append(r, a) | |
o = a.Pos | |
n-- | |
} | |
return r, o | |
} | |
func (d *D) f10(data []byte, pos int) ([]int, int) { | |
i := make([]int, 0) | |
tpos := pos | |
for { | |
n := d.m(data, tpos) | |
tpos = n.Pos | |
if n.Type == 11 { | |
return i, tpos | |
} | |
i = append(i, n.Val.(int)) | |
} | |
} | |
func (d *D) f11(data []byte, pos int) (string, int) { | |
_ = data | |
return "", pos | |
} | |
func (d *D) f12(data []byte, pos int) (int, int) { | |
_ = data | |
return 0, pos | |
} | |
func (d *D) f13(data []byte, pos int) ([]byte, int) { | |
i := d.m(data, pos) | |
return data[(pos + i.Pos):i.Val.(int)], pos + i.Pos + i.Val.(int) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment