You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

binary.go 2.6 kB

1 year ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package io2
  2. import (
  3. "bufio"
  4. "encoding/binary"
  5. "io"
  6. )
  7. // TODO2 定义BinaryWriter和BinaryReader类型,下面的函数作为它的成员函数
  8. func WriteBool(writer *bufio.Writer, val bool) error {
  9. v := byte(0)
  10. if val {
  11. v = 1
  12. }
  13. if err := writer.WriteByte(v); err != nil {
  14. return err
  15. }
  16. return nil
  17. }
  18. func ReadBool(reader *bufio.Reader) (bool, error) {
  19. v, err := reader.ReadByte()
  20. if err != nil {
  21. return false, err
  22. }
  23. return v > 0, nil
  24. }
  25. func WriteUint8Field(writer *bufio.Writer, data uint8) error {
  26. if err := writer.WriteByte(data); err != nil {
  27. return err
  28. }
  29. return nil
  30. }
  31. func ReadUint8Field(reader *bufio.Reader) (uint8, error) {
  32. data, err := reader.ReadByte()
  33. if err != nil {
  34. return 0, err
  35. }
  36. return data, nil
  37. }
  38. func WriteUint16Field(writer *bufio.Writer, data uint16) error {
  39. dataBytes := make([]byte, 2)
  40. binary.LittleEndian.PutUint16(dataBytes, data)
  41. err := WriteAll(writer, dataBytes)
  42. if err != nil {
  43. return err
  44. }
  45. return nil
  46. }
  47. func ReadUint16Field(reader *bufio.Reader) (uint16, error) {
  48. dataBytes := make([]byte, 2)
  49. _, err := io.ReadFull(reader, dataBytes)
  50. if err != nil {
  51. return 0, err
  52. }
  53. return binary.LittleEndian.Uint16(dataBytes), nil
  54. }
  55. func WriteUint32Field(writer *bufio.Writer, data uint32) error {
  56. dataBytes := make([]byte, 4)
  57. binary.LittleEndian.PutUint32(dataBytes, data)
  58. err := WriteAll(writer, dataBytes)
  59. if err != nil {
  60. return err
  61. }
  62. return nil
  63. }
  64. func ReadUint32Field(reader *bufio.Reader) (uint32, error) {
  65. dataBytes := make([]byte, 4)
  66. _, err := io.ReadFull(reader, dataBytes)
  67. if err != nil {
  68. return 0, err
  69. }
  70. return binary.LittleEndian.Uint32(dataBytes), nil
  71. }
  72. func WriteUint64Field(writer *bufio.Writer, data uint64) error {
  73. dataBytes := make([]byte, 8)
  74. binary.LittleEndian.PutUint64(dataBytes, data)
  75. err := WriteAll(writer, dataBytes)
  76. if err != nil {
  77. return err
  78. }
  79. return nil
  80. }
  81. func ReadUint64Field(reader *bufio.Reader) (uint64, error) {
  82. dataBytes := make([]byte, 8)
  83. _, err := io.ReadFull(reader, dataBytes)
  84. if err != nil {
  85. return 0, err
  86. }
  87. return binary.LittleEndian.Uint64(dataBytes), nil
  88. }
  89. func WriteStringField(writer *bufio.Writer, data string) error {
  90. dataBytes := []byte(data)
  91. if err := writer.WriteByte(byte(len(dataBytes))); err != nil {
  92. return err
  93. }
  94. err := WriteAll(writer, dataBytes)
  95. if err != nil {
  96. return err
  97. }
  98. return nil
  99. }
  100. func ReadStringField(reader *bufio.Reader) (string, error) {
  101. length, err := reader.ReadByte()
  102. if err != nil {
  103. return "", err
  104. }
  105. dataBytes := make([]byte, length)
  106. _, err = io.ReadFull(reader, dataBytes)
  107. if err != nil {
  108. return "", err
  109. }
  110. return string(dataBytes), nil
  111. }