github.com/Mrs4s/MiraiGo@v0.0.0-20240226124653-54bdd873e3fe/binary/jce/reader.go (about) 1 package jce 2 3 import ( 4 goBinary "encoding/binary" 5 "math" 6 7 "github.com/Mrs4s/MiraiGo/utils" 8 ) 9 10 type JceReader struct { 11 buf []byte 12 off int 13 } 14 15 type HeadData struct { 16 Type byte 17 Tag int 18 } 19 20 func NewJceReader(data []byte) *JceReader { 21 return &JceReader{buf: data} 22 } 23 24 func (r *JceReader) readHead() HeadData { 25 hd, l := r.peakHead() 26 r.off += l 27 return hd 28 } 29 30 func (r *JceReader) peakHead() (hd HeadData, l int) { 31 b := r.buf[r.off] 32 hd.Type = b & 0xF 33 hd.Tag = int(uint(b) >> 4) 34 l = 1 35 if hd.Tag == 0xF { 36 b = r.buf[r.off+1] 37 hd.Tag = int(uint(b)) 38 l = 2 39 } 40 return 41 } 42 43 func (r *JceReader) skipHead() { 44 l := 1 45 if int(uint(r.buf[r.off])>>4) == 0xF { 46 l = 2 47 } 48 r.off += l 49 } 50 51 func (r *JceReader) skip(l int) { 52 r.off += l 53 } 54 55 func (r *JceReader) skipField(t byte) { 56 switch t { 57 case 0: 58 r.skip(1) 59 case 1: 60 r.skip(2) 61 case 2, 4: 62 r.skip(4) 63 case 3, 5: 64 r.skip(8) 65 case 6: 66 r.skip(int(r.readByte())) 67 case 7: 68 r.skip(int(r.readUInt32())) 69 case 8: 70 s := r.ReadInt32(0) 71 for i := 0; i < int(s)*2; i++ { 72 r.skipNextField() 73 } 74 case 9: 75 s := r.ReadInt32(0) 76 for i := 0; i < int(s); i++ { 77 r.skipNextField() 78 } 79 case 13: 80 r.skipHead() 81 s := r.ReadInt32(0) 82 r.skip(int(s)) 83 case 10: 84 r.skipToStructEnd() 85 } 86 } 87 88 func (r *JceReader) skipNextField() { 89 hd := r.readHead() 90 r.skipField(hd.Type) 91 } 92 93 func (r *JceReader) SkipField(c int) { 94 for i := 0; i < c; i++ { 95 r.skipNextField() 96 } 97 } 98 99 func (r *JceReader) readBytes(n int) []byte { 100 if r.off+n > len(r.buf) { 101 panic("readBytes: EOF") 102 } 103 b := make([]byte, n) 104 r.off += copy(b, r.buf[r.off:]) 105 return b 106 } 107 108 func (r *JceReader) readByte() byte { 109 if r.off >= len(r.buf) { 110 panic("readByte: EOF") 111 } 112 b := r.buf[r.off] 113 r.off++ 114 return b 115 } 116 117 func (r *JceReader) readUInt16() uint16 { 118 b := make([]byte, 2) 119 r.off += copy(b, r.buf[r.off:]) 120 return goBinary.BigEndian.Uint16(b) 121 } 122 123 func (r *JceReader) readUInt32() uint32 { 124 b := make([]byte, 4) 125 r.off += copy(b, r.buf[r.off:]) 126 return goBinary.BigEndian.Uint32(b) 127 } 128 129 func (r *JceReader) readUInt64() uint64 { 130 b := make([]byte, 8) 131 r.off += copy(b, r.buf[r.off:]) 132 return goBinary.BigEndian.Uint64(b) 133 } 134 135 func (r *JceReader) readFloat32() float32 { 136 return math.Float32frombits(r.readUInt32()) 137 } 138 139 func (r *JceReader) readFloat64() float64 { 140 return math.Float64frombits(r.readUInt64()) 141 } 142 143 func (r *JceReader) skipToTag(tag int) bool { 144 hd, l := r.peakHead() 145 for tag > hd.Tag && hd.Type != 11 { 146 r.skip(l) 147 r.skipField(hd.Type) 148 hd, l = r.peakHead() 149 } 150 return tag == hd.Tag 151 } 152 153 func (r *JceReader) skipToStructEnd() { 154 hd := r.readHead() 155 for hd.Type != 11 { 156 r.skipField(hd.Type) 157 hd = r.readHead() 158 } 159 } 160 161 func (r *JceReader) ReadByte(tag int) byte { 162 if !r.skipToTag(tag) { 163 return 0 164 } 165 hd := r.readHead() 166 switch hd.Type { 167 case 12: 168 return 0 169 case 0: 170 return r.readByte() 171 default: 172 return 0 173 } 174 } 175 176 func (r *JceReader) ReadBool(tag int) bool { 177 return r.ReadByte(tag) != 0 178 } 179 180 func (r *JceReader) ReadInt16(tag int) int16 { 181 if !r.skipToTag(tag) { 182 return 0 183 } 184 hd := r.readHead() 185 switch hd.Type { 186 case 12: 187 return 0 188 case 0: 189 return int16(r.readByte()) 190 case 1: 191 return int16(r.readUInt16()) 192 default: 193 return 0 194 } 195 } 196 197 func (r *JceReader) ReadInt32(tag int) int32 { 198 if !r.skipToTag(tag) { 199 return 0 200 } 201 hd := r.readHead() 202 switch hd.Type { 203 case 12: 204 return 0 205 case 0: 206 return int32(r.readByte()) 207 case 1: 208 return int32(r.readUInt16()) 209 case 2: 210 return int32(r.readUInt32()) 211 default: 212 return 0 213 } 214 } 215 216 func (r *JceReader) ReadInt64(tag int) int64 { 217 if !r.skipToTag(tag) { 218 return 0 219 } 220 hd := r.readHead() 221 switch hd.Type { 222 case 12: 223 return 0 224 case 0: 225 return int64(r.readByte()) 226 case 1: 227 return int64(int16(r.readUInt16())) 228 case 2: 229 return int64(r.readUInt32()) 230 case 3: 231 return int64(r.readUInt64()) 232 default: 233 return 0 234 } 235 } 236 237 func (r *JceReader) ReadFloat32(tag int) float32 { 238 if !r.skipToTag(tag) { 239 return 0 240 } 241 hd := r.readHead() 242 switch hd.Type { 243 case 12: 244 return 0 245 case 4: 246 return r.readFloat32() 247 default: 248 return 0 249 } 250 } 251 252 func (r *JceReader) ReadFloat64(tag int) float64 { 253 if !r.skipToTag(tag) { 254 return 0 255 } 256 hd := r.readHead() 257 switch hd.Type { 258 case 12: 259 return 0 260 case 4: 261 return float64(r.readFloat32()) 262 case 5: 263 return r.readFloat64() 264 default: 265 return 0 266 } 267 } 268 269 func (r *JceReader) ReadString(tag int) string { 270 if !r.skipToTag(tag) { 271 return "" 272 } 273 hd := r.readHead() 274 switch hd.Type { 275 case 6: 276 return utils.B2S(r.readBytes(int(r.readByte()))) 277 case 7: 278 return utils.B2S(r.readBytes(int(r.readUInt32()))) 279 default: 280 return "" 281 } 282 } 283 284 func (r *JceReader) ReadBytes(tag int) []byte { 285 if !r.skipToTag(tag) { 286 return nil 287 } 288 hd := r.readHead() 289 switch hd.Type { 290 case 9: 291 s := r.ReadInt32(0) 292 b := make([]byte, s) 293 for i := 0; i < int(s); i++ { 294 b[i] = r.ReadByte(0) 295 } 296 return b 297 case 13: 298 r.skipHead() 299 return r.readBytes(int(r.ReadInt32(0))) 300 default: 301 return nil 302 } 303 } 304 305 func (r *JceReader) ReadByteArrArr(tag int) (baa [][]byte) { 306 if !r.skipToTag(tag) { 307 return nil 308 } 309 hd := r.readHead() 310 switch hd.Type { 311 case 9: 312 s := r.ReadInt32(0) 313 baa = make([][]byte, s) 314 for i := 0; i < int(s); i++ { 315 baa[i] = r.ReadBytes(0) 316 } 317 return baa 318 default: 319 return nil 320 } 321 } 322 323 /* 324 // ReadAny Read any type via tag, unsupported JceStruct 325 func (r *JceReader) ReadAny(tag int) interface{} { 326 if !r.skipToTag(tag) { 327 return nil 328 } 329 hd, _ := r.readHead() 330 switch hd.Type { 331 case 0: 332 return r.readByte() 333 case 1: 334 return r.readUInt16() 335 case 2: 336 return r.readUInt32() 337 case 3: 338 return r.readUInt64() 339 case 4: 340 return r.readFloat32() 341 case 5: 342 return r.readFloat64() 343 case 6: 344 return utils.B2S(r.readBytes(int(r.readByte()))) 345 case 7: 346 return utils.B2S(r.readBytes(int(r.readUInt32()))) 347 case 8: 348 s := r.ReadInt32(0) 349 m := make(map[interface{}]interface{}) 350 for i := 0; i < int(s); i++ { 351 m[r.ReadAny(0)] = r.ReadAny(1) 352 } 353 return m 354 case 9: 355 var sl []interface{} 356 s := r.ReadInt32(0) 357 for i := 0; i < int(s); i++ { 358 sl = append(sl, r.ReadAny(0)) 359 } 360 return sl 361 case 12: 362 return 0 363 case 13: 364 r.skipHead() 365 return r.readBytes(int(r.ReadInt32(0))) 366 default: 367 return nil 368 } 369 } 370 */ 371 372 func (r *JceReader) ReadJceStruct(obj IJceStruct, tag int) { 373 if !r.skipToTag(tag) { 374 return 375 } 376 hd := r.readHead() 377 if hd.Type != 10 { 378 return 379 } 380 obj.ReadFrom(r) 381 r.skipToStructEnd() 382 } 383 384 func (r *JceReader) ReadMapStrStr(tag int) map[string]string { 385 if !r.skipToTag(tag) { 386 return nil 387 } 388 hd := r.readHead() 389 switch hd.Type { 390 case 8: 391 s := r.ReadInt32(0) 392 m := make(map[string]string, s) 393 for i := 0; i < int(s); i++ { 394 m[r.ReadString(0)] = r.ReadString(1) 395 } 396 return m 397 default: 398 return nil 399 } 400 } 401 402 func (r *JceReader) ReadMapStrByte(tag int) map[string][]byte { 403 if !r.skipToTag(tag) { 404 return nil 405 } 406 hd := r.readHead() 407 switch hd.Type { 408 case 8: 409 s := r.ReadInt32(0) 410 m := make(map[string][]byte, s) 411 for i := 0; i < int(s); i++ { 412 m[r.ReadString(0)] = r.ReadBytes(1) 413 } 414 return m 415 default: 416 return nil 417 } 418 } 419 420 func (r *JceReader) ReadMapIntVipInfo(tag int) map[int]*VipInfo { 421 if !r.skipToTag(tag) { 422 return nil 423 } 424 r.skipHead() 425 hd := r.readHead() 426 switch hd.Type { 427 case 8: 428 s := r.ReadInt32(0) 429 m := make(map[int]*VipInfo, s) 430 for i := 0; i < int(s); i++ { 431 k := r.ReadInt64(0) 432 v := new(VipInfo) 433 r.readHead() 434 v.ReadFrom(r) 435 r.skipToStructEnd() 436 m[int(k)] = v 437 } 438 r.skipToStructEnd() 439 return m 440 default: 441 r.skipToStructEnd() 442 return nil 443 } 444 } 445 446 func (r *JceReader) ReadMapStrMapStrByte(tag int) map[string]map[string][]byte { 447 if !r.skipToTag(tag) { 448 return nil 449 } 450 hd := r.readHead() 451 switch hd.Type { 452 case 8: 453 s := r.ReadInt32(0) 454 m := make(map[string]map[string][]byte, s) 455 for i := 0; i < int(s); i++ { 456 m[r.ReadString(0)] = r.ReadMapStrByte(1) 457 } 458 return m 459 default: 460 return nil 461 } 462 } 463 464 /* 465 func (r *JceReader) ReadMap(i interface{}, tag int) { 466 r.readMap(reflect.ValueOf(i), tag) 467 } 468 469 func (r *JceReader) readMap(v reflect.Value, tag int) { 470 if v.Kind() != reflect.Map || !r.skipToTag(tag) { 471 return 472 } 473 t := v.Type() 474 475 kt := t.Key() 476 vt := t.Elem() 477 r.skipHead() 478 s := r.ReadInt32(0) 479 480 // map with string key or string value is very common. 481 // specialize for string 482 if kt.Kind() == reflect.String && vt.Kind() == reflect.String { 483 for i := 0; i < int(s); i++ { 484 kv := reflect.ValueOf(r.ReadString(0)) 485 vv := reflect.ValueOf(r.ReadString(1)) 486 v.SetMapIndex(kv, vv) 487 } 488 return 489 } 490 491 if kt.Kind() == reflect.String { 492 vv := reflect.New(vt) 493 for i := 0; i < int(s); i++ { 494 kv := reflect.ValueOf(r.ReadString(0)) 495 r.readObject(vv, 1) 496 v.SetMapIndex(kv, vv.Elem()) 497 } 498 return 499 } 500 501 kv := reflect.New(kt) 502 vv := reflect.New(vt) 503 for i := 0; i < int(s); i++ { 504 r.readObject(kv, 0) 505 r.readObject(vv, 1) 506 v.SetMapIndex(kv.Elem(), vv.Elem()) 507 } 508 } 509 */ 510 511 func (r *JceReader) ReadFileStorageServerInfos(tag int) []FileStorageServerInfo { 512 if !r.skipToTag(tag) { 513 return nil 514 } 515 hd := r.readHead() 516 switch hd.Type { 517 case 9: 518 s := r.ReadInt32(0) 519 sl := make([]FileStorageServerInfo, s) 520 for i := 0; i < int(s); i++ { 521 r.skipHead() 522 sl[i].ReadFrom(r) 523 r.skipToStructEnd() 524 } 525 return sl 526 default: 527 return nil 528 } 529 } 530 531 func (r *JceReader) ReadBigDataIPLists(tag int) []BigDataIPList { 532 if !r.skipToTag(tag) { 533 return nil 534 } 535 hd := r.readHead() 536 switch hd.Type { 537 case 9: 538 s := r.ReadInt32(0) 539 sl := make([]BigDataIPList, s) 540 for i := 0; i < int(s); i++ { 541 r.skipHead() 542 sl[i].ReadFrom(r) 543 r.skipToStructEnd() 544 } 545 return sl 546 default: 547 return nil 548 } 549 } 550 551 func (r *JceReader) ReadBigDataIPInfos(tag int) []BigDataIPInfo { 552 if !r.skipToTag(tag) { 553 return nil 554 } 555 hd := r.readHead() 556 switch hd.Type { 557 case 9: 558 s := r.ReadInt32(0) 559 sl := make([]BigDataIPInfo, s) 560 for i := 0; i < int(s); i++ { 561 r.skipHead() 562 sl[i].ReadFrom(r) 563 r.skipToStructEnd() 564 } 565 return sl 566 default: 567 return nil 568 } 569 } 570 571 func (r *JceReader) ReadOnlineInfos(tag int) []OnlineInfo { 572 if !r.skipToTag(tag) { 573 return nil 574 } 575 hd := r.readHead() 576 switch hd.Type { 577 case 9: 578 s := r.ReadInt32(0) 579 sl := make([]OnlineInfo, s) 580 for i := 0; i < int(s); i++ { 581 r.skipHead() 582 sl[i].ReadFrom(r) 583 r.skipToStructEnd() 584 } 585 return sl 586 default: 587 return nil 588 } 589 } 590 591 func (r *JceReader) ReadInstanceInfos(tag int) []InstanceInfo { 592 if !r.skipToTag(tag) { 593 return nil 594 } 595 hd := r.readHead() 596 switch hd.Type { 597 case 9: 598 s := r.ReadInt32(0) 599 sl := make([]InstanceInfo, s) 600 for i := 0; i < int(s); i++ { 601 r.skipHead() 602 sl[i].ReadFrom(r) 603 r.skipToStructEnd() 604 } 605 return sl 606 default: 607 return nil 608 } 609 } 610 611 func (r *JceReader) ReadSsoServerInfos(tag int) []SsoServerInfo { 612 if !r.skipToTag(tag) { 613 return nil 614 } 615 hd := r.readHead() 616 switch hd.Type { 617 case 9: 618 s := r.ReadInt32(0) 619 sl := make([]SsoServerInfo, s) 620 for i := 0; i < int(s); i++ { 621 r.skipHead() 622 sl[i].ReadFrom(r) 623 r.skipToStructEnd() 624 } 625 return sl 626 default: 627 return nil 628 } 629 } 630 631 func (r *JceReader) ReadFriendInfos(tag int) []FriendInfo { 632 if !r.skipToTag(tag) { 633 return nil 634 } 635 hd := r.readHead() 636 switch hd.Type { 637 case 9: 638 s := r.ReadInt32(0) 639 sl := make([]FriendInfo, s) 640 for i := 0; i < int(s); i++ { 641 r.skipHead() 642 sl[i].ReadFrom(r) 643 r.skipToStructEnd() 644 } 645 return sl 646 default: 647 return nil 648 } 649 } 650 651 func (r *JceReader) ReadTroopNumbers(tag int) []TroopNumber { 652 if !r.skipToTag(tag) { 653 return nil 654 } 655 hd := r.readHead() 656 switch hd.Type { 657 case 9: 658 s := r.ReadInt32(0) 659 sl := make([]TroopNumber, s) 660 for i := 0; i < int(s); i++ { 661 r.skipHead() 662 sl[i].ReadFrom(r) 663 r.skipToStructEnd() 664 } 665 return sl 666 default: 667 return nil 668 } 669 } 670 671 func (r *JceReader) ReadTroopMemberInfos(tag int) []TroopMemberInfo { 672 if !r.skipToTag(tag) { 673 return nil 674 } 675 hd := r.readHead() 676 switch hd.Type { 677 case 9: 678 s := r.ReadInt32(0) 679 sl := make([]TroopMemberInfo, s) 680 for i := 0; i < int(s); i++ { 681 r.skipHead() 682 sl[i].ReadFrom(r) 683 r.skipToStructEnd() 684 } 685 return sl 686 default: 687 return nil 688 } 689 } 690 691 func (r *JceReader) ReadPushMessageInfos(tag int) []PushMessageInfo { 692 if !r.skipToTag(tag) { 693 return nil 694 } 695 hd := r.readHead() 696 switch hd.Type { 697 case 9: 698 s := r.ReadInt32(0) 699 sl := make([]PushMessageInfo, s) 700 for i := 0; i < int(s); i++ { 701 r.skipHead() 702 sl[i].ReadFrom(r) 703 r.skipToStructEnd() 704 } 705 return sl 706 default: 707 return nil 708 } 709 } 710 711 func (r *JceReader) ReadSvcDevLoginInfos(tag int) []SvcDevLoginInfo { 712 if !r.skipToTag(tag) { 713 return nil 714 } 715 hd := r.readHead() 716 switch hd.Type { 717 case 9: 718 s := r.ReadInt32(0) 719 sl := make([]SvcDevLoginInfo, s) 720 for i := 0; i < int(s); i++ { 721 r.skipHead() 722 sl[i].ReadFrom(r) 723 r.skipToStructEnd() 724 } 725 return sl 726 default: 727 return nil 728 } 729 } 730 731 /* 732 func (r *JceReader) ReadSlice(i interface{}, tag int) { 733 r.readSlice(reflect.ValueOf(i), tag) 734 } 735 736 func (r *JceReader) readSlice(v reflect.Value, tag int) { 737 t := v.Type() 738 if t.Kind() != reflect.Ptr || t.Elem().Kind() != reflect.Slice || !r.skipToTag(tag) { 739 return 740 } 741 v = v.Elem() 742 t = t.Elem() 743 hd, _ := r.readHead() 744 if hd.Type == 9 { 745 s := r.ReadInt32(0) 746 sv := reflect.MakeSlice(t, int(s), int(s)) 747 t = t.Elem() 748 val := reflect.New(t) 749 for i := 0; i < int(s); i++ { 750 r.readObject(val, 0) 751 sv.Index(i).Set(val.Elem()) 752 } 753 v.Set(sv) 754 } 755 if hd.Type == 13 && t.Elem().Kind() == reflect.Uint8 { 756 r.skipHead() 757 arr := r.readBytes(int(r.ReadInt32(0))) 758 v.SetBytes(arr) 759 } 760 } 761 762 func (r *JceReader) ReadObject(i interface{}, tag int) { 763 r.readObject(reflect.ValueOf(i), tag) 764 } 765 766 func (r *JceReader) readObject(v reflect.Value, tag int) { 767 if v.Kind() != reflect.Ptr || v.IsNil() { 768 return 769 } 770 elemType := v.Type().Elem() 771 if elemType.Kind() == reflect.Map { 772 elem := v.Elem() 773 elem.Set(reflect.MakeMap(elem.Type())) 774 r.readMap(elem, tag) 775 return 776 } else if elemType.Kind() == reflect.Slice && // *[]byte 777 elemType.Elem().Kind() == reflect.Uint8 { 778 elem := v.Elem() 779 elem.SetBytes(r.ReadBytes(tag)) 780 return 781 } 782 783 switch elemType.Kind() { 784 case reflect.Uint8, reflect.Int8: 785 *(*uint8)(pointerOf(v)) = r.ReadByte(tag) 786 case reflect.Bool: 787 *(*bool)(pointerOf(v)) = r.ReadBool(tag) 788 case reflect.Uint16, reflect.Int16: 789 *(*int16)(pointerOf(v)) = r.ReadInt16(tag) 790 case reflect.Uint32, reflect.Int32: 791 *(*int32)(pointerOf(v)) = r.ReadInt32(tag) 792 case reflect.Uint64, reflect.Int64: 793 *(*int64)(pointerOf(v)) = r.ReadInt64(tag) 794 case reflect.String: 795 *(*string)(pointerOf(v)) = r.ReadString(tag) 796 797 default: 798 // other cases 799 switch o := v.Interface().(type) { 800 case IJceStruct: 801 r.skipHead() 802 o.ReadFrom(r) 803 r.skipToStructEnd() 804 case *float32: 805 *o = r.ReadFloat32(tag) 806 case *float64: 807 *o = r.ReadFloat64(tag) 808 } 809 } 810 } 811 */