2
0

bufferhelper.go 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  1. package util
  2. import (
  3. "bufio"
  4. "bytes"
  5. "encoding/binary"
  6. "io"
  7. "math"
  8. )
  9. func readBool(r *bytes.Buffer, data *bool) error {
  10. b, err := r.ReadByte()
  11. if err != nil {
  12. return err
  13. }
  14. *data = b != 0
  15. return nil
  16. }
  17. func readInt8(r *bytes.Buffer, data *int8) error {
  18. b, err := r.ReadByte()
  19. if err != nil {
  20. return err
  21. }
  22. *data = int8(b)
  23. return nil
  24. }
  25. func readUint8(r *bytes.Buffer, data *uint8) error {
  26. b, err := r.ReadByte()
  27. if err != nil {
  28. return err
  29. }
  30. *data = uint8(b)
  31. return nil
  32. }
  33. func readInt16(r *bytes.Buffer, data *int16) error {
  34. order := binary.LittleEndian
  35. var b [2]byte
  36. bs := b[:]
  37. _, err := readFull(r, bs)
  38. if err != nil {
  39. return err
  40. }
  41. *data = int16(order.Uint16(bs))
  42. return nil
  43. }
  44. func readUint16(r *bytes.Buffer, data *uint16) error {
  45. order := binary.LittleEndian
  46. var b [2]byte
  47. bs := b[:]
  48. _, err := readFull(r, bs)
  49. if err != nil {
  50. return err
  51. }
  52. *data = order.Uint16(bs)
  53. return nil
  54. }
  55. func readInt(r *bytes.Buffer, data *int) error {
  56. order := binary.LittleEndian
  57. var b [4]byte
  58. bs := b[:]
  59. _, err := readFull(r, bs)
  60. if err != nil {
  61. return err
  62. }
  63. *data = int(int32(order.Uint32(bs)))
  64. return nil
  65. }
  66. func readInt32(r *bytes.Buffer, data *int32) error {
  67. order := binary.LittleEndian
  68. var b [4]byte
  69. bs := b[:]
  70. _, err := readFull(r, bs)
  71. if err != nil {
  72. return err
  73. }
  74. *data = int32(order.Uint32(bs))
  75. return nil
  76. }
  77. func readUint(r *bytes.Buffer, data *uint) error {
  78. order := binary.LittleEndian
  79. var b [4]byte
  80. bs := b[:]
  81. _, err := readFull(r, bs)
  82. if err != nil {
  83. return err
  84. }
  85. *data = uint(order.Uint32(bs))
  86. return nil
  87. }
  88. func readUint32(r *bytes.Buffer, data *uint32) error {
  89. order := binary.LittleEndian
  90. var b [4]byte
  91. bs := b[:]
  92. _, err := readFull(r, bs)
  93. if err != nil {
  94. return err
  95. }
  96. *data = order.Uint32(bs)
  97. return nil
  98. }
  99. func readInt64(r *bytes.Buffer, data *int64) error {
  100. order := binary.LittleEndian
  101. var b [8]byte
  102. bs := b[:]
  103. _, err := readFull(r, bs)
  104. if err != nil {
  105. return err
  106. }
  107. *data = int64(order.Uint64(bs))
  108. return nil
  109. }
  110. func readUint64(r *bytes.Buffer, data *uint64) error {
  111. order := binary.LittleEndian
  112. var b [8]byte
  113. bs := b[:]
  114. _, err := readFull(r, bs)
  115. if err != nil {
  116. return err
  117. }
  118. *data = order.Uint64(bs)
  119. return nil
  120. }
  121. func readFloat32(r *bytes.Buffer, data *float32) error {
  122. order := binary.LittleEndian
  123. var b [4]byte
  124. bs := b[:]
  125. _, err := readFull(r, bs)
  126. if err != nil {
  127. return err
  128. }
  129. *data = math.Float32frombits(order.Uint32(bs))
  130. return nil
  131. }
  132. func readFloat64(r *bytes.Buffer, data *float64) error {
  133. order := binary.LittleEndian
  134. var b [8]byte
  135. bs := b[:]
  136. _, err := readFull(r, bs)
  137. if err != nil {
  138. return err
  139. }
  140. *data = math.Float64frombits(order.Uint64(bs))
  141. return nil
  142. }
  143. func readBuffBool(r *bufio.Reader, data *bool) error {
  144. b, err := r.ReadByte()
  145. if err != nil {
  146. return err
  147. }
  148. *data = b != 0
  149. return nil
  150. }
  151. func readBuffInt8(r *bufio.Reader, data *int8) error {
  152. b, err := r.ReadByte()
  153. if err != nil {
  154. return err
  155. }
  156. *data = int8(b)
  157. return nil
  158. }
  159. func readBuffUint8(r *bufio.Reader, data *uint8) error {
  160. b, err := r.ReadByte()
  161. if err != nil {
  162. return err
  163. }
  164. *data = uint8(b)
  165. return nil
  166. }
  167. func readBuffInt16(r *bufio.Reader, data *int16) error {
  168. order := binary.LittleEndian
  169. var b [2]byte
  170. bs := b[:]
  171. _, err := readBuffFull(r, bs)
  172. if err != nil {
  173. return err
  174. }
  175. *data = int16(order.Uint16(bs))
  176. return nil
  177. }
  178. func readBuffUint16(r *bufio.Reader, data *uint16) error {
  179. order := binary.LittleEndian
  180. var b [2]byte
  181. bs := b[:]
  182. _, err := readBuffFull(r, bs)
  183. if err != nil {
  184. return err
  185. }
  186. *data = order.Uint16(bs)
  187. return nil
  188. }
  189. func readBuffInt(r *bufio.Reader, data *int) error {
  190. order := binary.LittleEndian
  191. var b [4]byte
  192. bs := b[:]
  193. _, err := readBuffFull(r, bs)
  194. if err != nil {
  195. return err
  196. }
  197. *data = int(int32(order.Uint32(bs)))
  198. return nil
  199. }
  200. func readBuffInt32(r *bufio.Reader, data *int32) error {
  201. order := binary.LittleEndian
  202. var b [4]byte
  203. bs := b[:]
  204. _, err := readBuffFull(r, bs)
  205. if err != nil {
  206. return err
  207. }
  208. *data = int32(order.Uint32(bs))
  209. return nil
  210. }
  211. func readBuffUint(r *bufio.Reader, data *uint) error {
  212. order := binary.LittleEndian
  213. var b [4]byte
  214. bs := b[:]
  215. _, err := readBuffFull(r, bs)
  216. if err != nil {
  217. return err
  218. }
  219. *data = uint(order.Uint32(bs))
  220. return nil
  221. }
  222. func readBuffUint32(r *bufio.Reader, data *uint32) error {
  223. order := binary.LittleEndian
  224. var b [4]byte
  225. bs := b[:]
  226. _, err := readBuffFull(r, bs)
  227. if err != nil {
  228. return err
  229. }
  230. *data = order.Uint32(bs)
  231. return nil
  232. }
  233. func readBuffInt64(r *bufio.Reader, data *int64) error {
  234. order := binary.LittleEndian
  235. var b [8]byte
  236. bs := b[:]
  237. _, err := readBuffFull(r, bs)
  238. if err != nil {
  239. return err
  240. }
  241. *data = int64(order.Uint64(bs))
  242. return nil
  243. }
  244. func readBuffUint64(r *bufio.Reader, data *uint64) error {
  245. order := binary.LittleEndian
  246. var b [8]byte
  247. bs := b[:]
  248. _, err := readBuffFull(r, bs)
  249. if err != nil {
  250. return err
  251. }
  252. *data = order.Uint64(bs)
  253. return nil
  254. }
  255. func readBuffFloat32(r *bufio.Reader, data *float32) error {
  256. order := binary.LittleEndian
  257. var b [4]byte
  258. bs := b[:]
  259. _, err := readBuffFull(r, bs)
  260. if err != nil {
  261. return err
  262. }
  263. *data = math.Float32frombits(order.Uint32(bs))
  264. return nil
  265. }
  266. func readBuffFloat64(r *bufio.Reader, data *float64) error {
  267. order := binary.LittleEndian
  268. var b [8]byte
  269. bs := b[:]
  270. _, err := readBuffFull(r, bs)
  271. if err != nil {
  272. return err
  273. }
  274. *data = math.Float64frombits(order.Uint64(bs))
  275. return nil
  276. }
  277. // read full is a bufio.Reader specific implementation of io.ReadFull() which
  278. // avoids escaping our stack allocated scratch bytes
  279. func readBuffFull(r *bufio.Reader, buf []byte) (n int, err error) {
  280. min := len(buf)
  281. for n < min && err == nil {
  282. var nn int
  283. nn, err = r.Read(buf[n:])
  284. n += nn
  285. }
  286. if n >= min {
  287. err = nil
  288. } else if n > 0 && err == io.EOF {
  289. err = io.ErrUnexpectedEOF
  290. }
  291. return
  292. }
  293. // read full is a bytes.Buffer specific implementation of io.ReadFull() which
  294. // avoids escaping our stack allocated scratch bytes
  295. func readFull(r *bytes.Buffer, buf []byte) (n int, err error) {
  296. min := len(buf)
  297. for n < min && err == nil {
  298. var nn int
  299. nn, err = r.Read(buf[n:])
  300. n += nn
  301. }
  302. if n >= min {
  303. err = nil
  304. } else if n > 0 && err == io.EOF {
  305. err = io.ErrUnexpectedEOF
  306. }
  307. return
  308. }
  309. func writeBool(w *bytes.Buffer, data bool) error {
  310. if data {
  311. w.WriteByte(1)
  312. return nil
  313. }
  314. w.WriteByte(0)
  315. return nil
  316. }
  317. func writeInt8(w *bytes.Buffer, data int8) error {
  318. w.WriteByte(byte(data))
  319. return nil
  320. }
  321. func writeUint8(w *bytes.Buffer, data uint8) error {
  322. w.WriteByte(byte(data))
  323. return nil
  324. }
  325. func writeInt16(w *bytes.Buffer, data int16) error {
  326. var b [2]byte
  327. bs := b[:]
  328. binary.LittleEndian.PutUint16(bs, uint16(data))
  329. _, err := w.Write(bs)
  330. return err
  331. }
  332. func writeUint16(w *bytes.Buffer, data uint16) error {
  333. var b [2]byte
  334. bs := b[:]
  335. binary.LittleEndian.PutUint16(bs, data)
  336. _, err := w.Write(bs)
  337. return err
  338. }
  339. func writeInt32(w *bytes.Buffer, data int32) error {
  340. var b [4]byte
  341. bs := b[:]
  342. binary.LittleEndian.PutUint32(bs, uint32(data))
  343. _, err := w.Write(bs)
  344. return err
  345. }
  346. func writeUint32(w *bytes.Buffer, data uint32) error {
  347. var b [4]byte
  348. bs := b[:]
  349. binary.LittleEndian.PutUint32(bs, data)
  350. _, err := w.Write(bs)
  351. return err
  352. }
  353. func writeInt(w *bytes.Buffer, data int) error {
  354. var b [4]byte
  355. bs := b[:]
  356. binary.LittleEndian.PutUint32(bs, uint32(int32(data)))
  357. _, err := w.Write(bs)
  358. return err
  359. }
  360. func writeUint(w *bytes.Buffer, data uint) error {
  361. var b [4]byte
  362. bs := b[:]
  363. binary.LittleEndian.PutUint32(bs, uint32(data))
  364. _, err := w.Write(bs)
  365. return err
  366. }
  367. func writeInt64(w *bytes.Buffer, data int64) error {
  368. var b [8]byte
  369. bs := b[:]
  370. binary.LittleEndian.PutUint64(bs, uint64(data))
  371. _, err := w.Write(bs)
  372. return err
  373. }
  374. func writeUint64(w *bytes.Buffer, data uint64) error {
  375. var b [8]byte
  376. bs := b[:]
  377. binary.LittleEndian.PutUint64(bs, data)
  378. _, err := w.Write(bs)
  379. return err
  380. }
  381. func writeFloat32(w *bytes.Buffer, data float32) error {
  382. var b [4]byte
  383. bs := b[:]
  384. binary.LittleEndian.PutUint32(bs, math.Float32bits(data))
  385. _, err := w.Write(bs)
  386. return err
  387. }
  388. func writeFloat64(w *bytes.Buffer, data float64) error {
  389. var b [8]byte
  390. bs := b[:]
  391. binary.LittleEndian.PutUint64(bs, math.Float64bits(data))
  392. _, err := w.Write(bs)
  393. return err
  394. }