unmarshal.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. // Copyright (C) 2014 Jakob Borg and Contributors (see the CONTRIBUTORS file).
  2. // All rights reserved. Use of this source code is governed by an MIT-style
  3. // license that can be found in the LICENSE file.
  4. package xdr
  5. import "io"
  6. type Unmarshaller struct {
  7. Error error
  8. Data []byte
  9. }
  10. func (u *Unmarshaller) UnmarshalRaw(l int) []byte {
  11. if u.Error != nil {
  12. return nil
  13. }
  14. if len(u.Data) < l {
  15. u.Error = io.ErrUnexpectedEOF
  16. return nil
  17. }
  18. v := u.Data[:l]
  19. u.Data = u.Data[l:]
  20. return v
  21. }
  22. func (u *Unmarshaller) UnmarshalString() string {
  23. return u.UnmarshalStringMax(0)
  24. }
  25. func (u *Unmarshaller) UnmarshalStringMax(max int) string {
  26. buf := u.UnmarshalBytesMax(max)
  27. if len(buf) == 0 || u.Error != nil {
  28. return ""
  29. }
  30. return string(buf)
  31. }
  32. func (u *Unmarshaller) UnmarshalBytes() []byte {
  33. return u.UnmarshalBytesMax(0)
  34. }
  35. func (u *Unmarshaller) UnmarshalBytesMax(max int) []byte {
  36. if u.Error != nil {
  37. return nil
  38. }
  39. if len(u.Data) < 4 {
  40. u.Error = io.ErrUnexpectedEOF
  41. return nil
  42. }
  43. l := int(u.Data[3]) | int(u.Data[2])<<8 | int(u.Data[1])<<16 | int(u.Data[0])<<24
  44. if l == 0 {
  45. u.Data = u.Data[4:]
  46. return nil
  47. }
  48. if l < 0 || max > 0 && l > max {
  49. // l may be negative on 32 bit builds
  50. u.Error = ElementSizeExceeded("bytes field", l, max)
  51. return nil
  52. }
  53. if len(u.Data) < l+4 {
  54. u.Error = io.ErrUnexpectedEOF
  55. return nil
  56. }
  57. v := u.Data[4 : 4+l]
  58. u.Data = u.Data[4+l+Padding(l):]
  59. return v
  60. }
  61. func (u *Unmarshaller) UnmarshalBool() bool {
  62. return u.UnmarshalUint8() != 0
  63. }
  64. func (u *Unmarshaller) UnmarshalUint8() uint8 {
  65. if u.Error != nil {
  66. return 0
  67. }
  68. if len(u.Data) < 4 {
  69. u.Error = io.ErrUnexpectedEOF
  70. return 0
  71. }
  72. v := uint8(u.Data[3])
  73. u.Data = u.Data[4:]
  74. return v
  75. }
  76. func (u *Unmarshaller) UnmarshalUint16() uint16 {
  77. if u.Error != nil {
  78. return 0
  79. }
  80. if len(u.Data) < 4 {
  81. u.Error = io.ErrUnexpectedEOF
  82. return 0
  83. }
  84. v := uint16(u.Data[3]) | uint16(u.Data[2])<<8
  85. u.Data = u.Data[4:]
  86. return v
  87. }
  88. func (u *Unmarshaller) UnmarshalUint32() uint32 {
  89. if u.Error != nil {
  90. return 0
  91. }
  92. if len(u.Data) < 4 {
  93. u.Error = io.ErrUnexpectedEOF
  94. return 0
  95. }
  96. v := uint32(u.Data[3]) | uint32(u.Data[2])<<8 | uint32(u.Data[1])<<16 | uint32(u.Data[0])<<24
  97. u.Data = u.Data[4:]
  98. return v
  99. }
  100. func (u *Unmarshaller) UnmarshalUint64() uint64 {
  101. if u.Error != nil {
  102. return 0
  103. }
  104. if len(u.Data) < 8 {
  105. u.Error = io.ErrUnexpectedEOF
  106. return 0
  107. }
  108. v := uint64(u.Data[7]) | uint64(u.Data[6])<<8 | uint64(u.Data[5])<<16 | uint64(u.Data[4])<<24 |
  109. uint64(u.Data[3])<<32 | uint64(u.Data[2])<<40 | uint64(u.Data[1])<<48 | uint64(u.Data[0])<<56
  110. u.Data = u.Data[8:]
  111. return v
  112. }