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  */