Skip to content

Instantly share code, notes, and snippets.

@iyear
Last active January 18, 2022 14:15
Show Gist options
  • Save iyear/b580a87c1a76c564c77783e02b98a364 to your computer and use it in GitHub Desktop.
Save iyear/b580a87c1a76c564c77783e02b98a364 to your computer and use it in GitHub Desktop.
企鹅电竞模拟 js 实现 websocket 二进制数据解析(未完成)后续使用 goja 直接运行魔改后的js实现
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