decode_string.go (3280B)
1 package msgpack 2 3 import ( 4 "fmt" 5 "reflect" 6 7 "github.com/vmihailenco/msgpack/v5/msgpcode" 8 ) 9 10 func (d *Decoder) bytesLen(c byte) (int, error) { 11 if c == msgpcode.Nil { 12 return -1, nil 13 } 14 15 if msgpcode.IsFixedString(c) { 16 return int(c & msgpcode.FixedStrMask), nil 17 } 18 19 switch c { 20 case msgpcode.Str8, msgpcode.Bin8: 21 n, err := d.uint8() 22 return int(n), err 23 case msgpcode.Str16, msgpcode.Bin16: 24 n, err := d.uint16() 25 return int(n), err 26 case msgpcode.Str32, msgpcode.Bin32: 27 n, err := d.uint32() 28 return int(n), err 29 } 30 31 return 0, fmt.Errorf("msgpack: invalid code=%x decoding string/bytes length", c) 32 } 33 34 func (d *Decoder) DecodeString() (string, error) { 35 if intern := d.flags&useInternedStringsFlag != 0; intern || len(d.dict) > 0 { 36 return d.decodeInternedString(intern) 37 } 38 39 c, err := d.readCode() 40 if err != nil { 41 return "", err 42 } 43 return d.string(c) 44 } 45 46 func (d *Decoder) string(c byte) (string, error) { 47 n, err := d.bytesLen(c) 48 if err != nil { 49 return "", err 50 } 51 return d.stringWithLen(n) 52 } 53 54 func (d *Decoder) stringWithLen(n int) (string, error) { 55 if n <= 0 { 56 return "", nil 57 } 58 b, err := d.readN(n) 59 return string(b), err 60 } 61 62 func decodeStringValue(d *Decoder, v reflect.Value) error { 63 s, err := d.DecodeString() 64 if err != nil { 65 return err 66 } 67 v.SetString(s) 68 return nil 69 } 70 71 func (d *Decoder) DecodeBytesLen() (int, error) { 72 c, err := d.readCode() 73 if err != nil { 74 return 0, err 75 } 76 return d.bytesLen(c) 77 } 78 79 func (d *Decoder) DecodeBytes() ([]byte, error) { 80 c, err := d.readCode() 81 if err != nil { 82 return nil, err 83 } 84 return d.bytes(c, nil) 85 } 86 87 func (d *Decoder) bytes(c byte, b []byte) ([]byte, error) { 88 n, err := d.bytesLen(c) 89 if err != nil { 90 return nil, err 91 } 92 if n == -1 { 93 return nil, nil 94 } 95 return readN(d.r, b, n) 96 } 97 98 func (d *Decoder) decodeStringTemp() (string, error) { 99 if intern := d.flags&useInternedStringsFlag != 0; intern || len(d.dict) > 0 { 100 return d.decodeInternedString(intern) 101 } 102 103 c, err := d.readCode() 104 if err != nil { 105 return "", err 106 } 107 108 n, err := d.bytesLen(c) 109 if err != nil { 110 return "", err 111 } 112 if n == -1 { 113 return "", nil 114 } 115 116 b, err := d.readN(n) 117 if err != nil { 118 return "", err 119 } 120 121 return bytesToString(b), nil 122 } 123 124 func (d *Decoder) decodeBytesPtr(ptr *[]byte) error { 125 c, err := d.readCode() 126 if err != nil { 127 return err 128 } 129 return d.bytesPtr(c, ptr) 130 } 131 132 func (d *Decoder) bytesPtr(c byte, ptr *[]byte) error { 133 n, err := d.bytesLen(c) 134 if err != nil { 135 return err 136 } 137 if n == -1 { 138 *ptr = nil 139 return nil 140 } 141 142 *ptr, err = readN(d.r, *ptr, n) 143 return err 144 } 145 146 func (d *Decoder) skipBytes(c byte) error { 147 n, err := d.bytesLen(c) 148 if err != nil { 149 return err 150 } 151 if n <= 0 { 152 return nil 153 } 154 return d.skipN(n) 155 } 156 157 func decodeBytesValue(d *Decoder, v reflect.Value) error { 158 c, err := d.readCode() 159 if err != nil { 160 return err 161 } 162 163 b, err := d.bytes(c, v.Bytes()) 164 if err != nil { 165 return err 166 } 167 168 v.SetBytes(b) 169 170 return nil 171 } 172 173 func decodeByteArrayValue(d *Decoder, v reflect.Value) error { 174 c, err := d.readCode() 175 if err != nil { 176 return err 177 } 178 179 n, err := d.bytesLen(c) 180 if err != nil { 181 return err 182 } 183 if n == -1 { 184 return nil 185 } 186 if n > v.Len() { 187 return fmt.Errorf("%s len is %d, but msgpack has %d elements", v.Type(), v.Len(), n) 188 } 189 190 b := v.Slice(0, n).Bytes() 191 return d.readFull(b) 192 }