decode_string.go 3.2 KB

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