diff --git a/binary/jce/reader.go b/binary/jce/reader.go index f46b9b47..24935017 100644 --- a/binary/jce/reader.go +++ b/binary/jce/reader.go @@ -276,6 +276,27 @@ func (r *JceReader) ReadString(tag int) string { } } +func (r *JceReader) ReadBytes(tag int) []byte { + if !r.skipToTag(tag) { + return nil + } + hd, _ := r.readHead() + switch hd.Type { + case 9: + s := r.ReadInt32(0) + b := make([]byte, s) + for i := 0; i < int(s); i++ { + b[i] = r.ReadByte(0) + } + return b + case 13: + r.readHead() + return r.readBytes(int(r.ReadInt32(0))) + default: + return nil + } +} + // ReadAny Read any type via tag, unsupported JceStruct func (r *JceReader) ReadAny(tag int) interface{} { if !r.skipToTag(tag) { diff --git a/binary/jce/reader_test.go b/binary/jce/reader_test.go index 66881f4e..0a687501 100644 --- a/binary/jce/reader_test.go +++ b/binary/jce/reader_test.go @@ -81,3 +81,15 @@ func BenchmarkRequestDataVersion2_ReadFrom(b *testing.B) { result.ReadFrom(NewJceReader(src)) } } + +func TestJceReader_ReadBytes(t *testing.T) { + b := make([]byte, 1024) + rand.Read(b) + + w := NewJceWriter() + w.WriteBytes(b, 0) + r := NewJceReader(w.Bytes()) + rb := r.ReadBytes(0) + + assert.Equal(t, b, rb) +}