decoder.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. package binary
  2. import (
  3. "encoding/binary"
  4. "io"
  5. "math"
  6. )
  7. func NewDecoder(input io.Reader) *Decoder {
  8. return &Decoder{
  9. input: input,
  10. }
  11. }
  12. func NewDecoderWithCompress(input io.Reader) *Decoder {
  13. return &Decoder{
  14. input: input,
  15. compressInput: NewCompressReader(input),
  16. }
  17. }
  18. type Decoder struct {
  19. compress bool
  20. input io.Reader
  21. compressInput io.Reader
  22. scratch [binary.MaxVarintLen64]byte
  23. }
  24. func (decoder *Decoder) SelectCompress(compress bool) {
  25. decoder.compress = compress
  26. }
  27. func (decoder *Decoder) Get() io.Reader {
  28. if decoder.compress && decoder.compressInput != nil {
  29. return decoder.compressInput
  30. }
  31. return decoder.input
  32. }
  33. func (decoder *Decoder) Bool() (bool, error) {
  34. v, err := decoder.ReadByte()
  35. if err != nil {
  36. return false, err
  37. }
  38. return v == 1, nil
  39. }
  40. func (decoder *Decoder) Uvarint() (uint64, error) {
  41. return binary.ReadUvarint(decoder)
  42. }
  43. func (decoder *Decoder) Int8() (int8, error) {
  44. v, err := decoder.ReadByte()
  45. if err != nil {
  46. return 0, err
  47. }
  48. return int8(v), nil
  49. }
  50. func (decoder *Decoder) Int16() (int16, error) {
  51. v, err := decoder.UInt16()
  52. if err != nil {
  53. return 0, err
  54. }
  55. return int16(v), nil
  56. }
  57. func (decoder *Decoder) Int32() (int32, error) {
  58. v, err := decoder.UInt32()
  59. if err != nil {
  60. return 0, err
  61. }
  62. return int32(v), nil
  63. }
  64. func (decoder *Decoder) Int64() (int64, error) {
  65. v, err := decoder.UInt64()
  66. if err != nil {
  67. return 0, err
  68. }
  69. return int64(v), nil
  70. }
  71. func (decoder *Decoder) UInt8() (uint8, error) {
  72. v, err := decoder.ReadByte()
  73. if err != nil {
  74. return 0, err
  75. }
  76. return uint8(v), nil
  77. }
  78. func (decoder *Decoder) UInt16() (uint16, error) {
  79. if _, err := decoder.Get().Read(decoder.scratch[:2]); err != nil {
  80. return 0, err
  81. }
  82. return uint16(decoder.scratch[0]) | uint16(decoder.scratch[1])<<8, nil
  83. }
  84. func (decoder *Decoder) UInt32() (uint32, error) {
  85. if _, err := decoder.Get().Read(decoder.scratch[:4]); err != nil {
  86. return 0, err
  87. }
  88. return uint32(decoder.scratch[0]) |
  89. uint32(decoder.scratch[1])<<8 |
  90. uint32(decoder.scratch[2])<<16 |
  91. uint32(decoder.scratch[3])<<24, nil
  92. }
  93. func (decoder *Decoder) UInt64() (uint64, error) {
  94. if _, err := decoder.Get().Read(decoder.scratch[:8]); err != nil {
  95. return 0, err
  96. }
  97. return uint64(decoder.scratch[0]) |
  98. uint64(decoder.scratch[1])<<8 |
  99. uint64(decoder.scratch[2])<<16 |
  100. uint64(decoder.scratch[3])<<24 |
  101. uint64(decoder.scratch[4])<<32 |
  102. uint64(decoder.scratch[5])<<40 |
  103. uint64(decoder.scratch[6])<<48 |
  104. uint64(decoder.scratch[7])<<56, nil
  105. }
  106. func (decoder *Decoder) Float32() (float32, error) {
  107. v, err := decoder.UInt32()
  108. if err != nil {
  109. return 0, err
  110. }
  111. return math.Float32frombits(v), nil
  112. }
  113. func (decoder *Decoder) Float64() (float64, error) {
  114. v, err := decoder.UInt64()
  115. if err != nil {
  116. return 0, err
  117. }
  118. return math.Float64frombits(v), nil
  119. }
  120. func (decoder *Decoder) Fixed(ln int) ([]byte, error) {
  121. if reader, ok := decoder.Get().(FixedReader); ok {
  122. return reader.Fixed(ln)
  123. }
  124. buf := make([]byte, ln)
  125. if _, err := decoder.Get().Read(buf); err != nil {
  126. return nil, err
  127. }
  128. return buf, nil
  129. }
  130. func (decoder *Decoder) String() (string, error) {
  131. strlen, err := decoder.Uvarint()
  132. if err != nil {
  133. return "", err
  134. }
  135. str, err := decoder.Fixed(int(strlen))
  136. if err != nil {
  137. return "", err
  138. }
  139. return string(str), nil
  140. }
  141. func (decoder *Decoder) Decimal128() ([]byte, error) {
  142. bytes := make([]byte, 16)
  143. _, err := decoder.Get().Read(bytes)
  144. return bytes, err
  145. }
  146. func (decoder *Decoder) ReadByte() (byte, error) {
  147. if _, err := decoder.Get().Read(decoder.scratch[:1]); err != nil {
  148. return 0x0, err
  149. }
  150. return decoder.scratch[0], nil
  151. }
  152. type FixedReader interface {
  153. Fixed(ln int) ([]byte, error)
  154. }