bufio.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. package protocol
  2. import (
  3. "bytes"
  4. "dlt645-server/utils"
  5. "encoding/binary"
  6. "golang.org/x/text/encoding/simplifiedchinese"
  7. "golang.org/x/text/transform"
  8. "io"
  9. "io/ioutil"
  10. "time"
  11. )
  12. type Writer struct {
  13. b *bytes.Buffer
  14. }
  15. func NewWriter() Writer {
  16. return Writer{b: bytes.NewBuffer(nil)}
  17. }
  18. func (writer *Writer) Bytes() []byte {
  19. return writer.b.Bytes()
  20. }
  21. func (writer *Writer) Write(p []byte, size ...int) *Writer {
  22. if len(size) == 0 {
  23. writer.b.Write(p)
  24. return writer
  25. }
  26. if len(p) >= size[0] {
  27. writer.b.Write(p[:size[0]])
  28. } else {
  29. writer.b.Write(p)
  30. end := size[0] - len(p)
  31. for i := 0; i < end; i++ {
  32. writer.b.WriteByte(0)
  33. }
  34. }
  35. return writer
  36. }
  37. func (writer *Writer) WriteByte(b byte) *Writer {
  38. writer.b.WriteByte(b)
  39. return writer
  40. }
  41. func (writer *Writer) WriteUint16(n uint16) *Writer {
  42. var buf [2]byte
  43. binary.BigEndian.PutUint16(buf[:], n)
  44. writer.b.Write(buf[:])
  45. return writer
  46. }
  47. func (writer *Writer) WriteUint32(n uint32) *Writer {
  48. var buf [4]byte
  49. binary.BigEndian.PutUint32(buf[:], n)
  50. writer.b.Write(buf[:])
  51. return writer
  52. }
  53. func (writer *Writer) WriteBcdTime(t time.Time) *Writer {
  54. writer.b.Write(utils.ToBCDTime(t))
  55. return writer
  56. }
  57. func (writer *Writer) WritString(str string, size ...int) error {
  58. reader := bytes.NewReader([]byte(str))
  59. data, err := ioutil.ReadAll(
  60. transform.NewReader(reader, simplifiedchinese.GB18030.NewEncoder()))
  61. if err != nil {
  62. return err
  63. }
  64. writer.Write(data, size...)
  65. return nil
  66. }
  67. type Reader struct {
  68. d []byte
  69. r *bytes.Reader
  70. }
  71. func NewReader(data []byte) Reader {
  72. return Reader{d: data, r: bytes.NewReader(data)}
  73. }
  74. func (reader *Reader) Len() int {
  75. return reader.r.Len()
  76. }
  77. func (reader *Reader) Read(size ...int) ([]byte, error) {
  78. num := reader.r.Len()
  79. if len(size) > 0 {
  80. num = size[0]
  81. }
  82. if num > reader.r.Len() {
  83. return nil, io.ErrUnexpectedEOF
  84. }
  85. curr := len(reader.d) - reader.r.Len()
  86. buf := reader.d[curr : curr+num]
  87. reader.r.Seek(int64(num), io.SeekCurrent)
  88. return buf, nil
  89. }
  90. func (reader *Reader) ReadByte() (byte, error) {
  91. return reader.r.ReadByte()
  92. }
  93. func (reader *Reader) ReadUint16() (uint16, error) {
  94. if reader.r.Len() < 2 {
  95. return 0, io.ErrUnexpectedEOF
  96. }
  97. var buf [2]byte
  98. n, err := reader.r.Read(buf[:])
  99. if err != nil {
  100. return 0, err
  101. }
  102. if n != len(buf) {
  103. return 0, io.ErrUnexpectedEOF
  104. }
  105. return binary.BigEndian.Uint16(buf[:]), nil
  106. }
  107. func (reader *Reader) ReadUint32() (uint32, error) {
  108. if reader.r.Len() < 4 {
  109. return 0, io.ErrUnexpectedEOF
  110. }
  111. var buf [4]byte
  112. n, err := reader.r.Read(buf[:])
  113. if err != nil {
  114. return 0, err
  115. }
  116. if n != len(buf) {
  117. return 0, io.ErrUnexpectedEOF
  118. }
  119. return binary.BigEndian.Uint32(buf[:]), nil
  120. }
  121. //LittleEndian高位到低位读取
  122. func (reader *Reader) ReadUint64() (uint64, error) {
  123. if reader.r.Len() < 8 {
  124. return 0, io.ErrUnexpectedEOF
  125. }
  126. var buf [8]byte
  127. n, err := reader.r.Read(buf[:])
  128. if err != nil {
  129. return 0, err
  130. }
  131. if n != len(buf) {
  132. return 0, io.ErrUnexpectedEOF
  133. }
  134. return binary.BigEndian.Uint64(buf[:]), nil
  135. }
  136. func (reader *Reader) ReadBcdTime() (time.Time, error) {
  137. if reader.r.Len() < 6 {
  138. return time.Time{}, io.ErrUnexpectedEOF
  139. }
  140. var buf [6]byte
  141. n, err := reader.r.Read(buf[:])
  142. if err != nil {
  143. return time.Time{}, err
  144. }
  145. if n != len(buf) {
  146. return time.Time{}, io.ErrUnexpectedEOF
  147. }
  148. return utils.FromBCDTime(buf[:])
  149. }
  150. func (reader *Reader) ReadString(size ...int) (string, error) {
  151. data, err := reader.Read(size...)
  152. if err != nil {
  153. return "", err
  154. }
  155. text, err := ioutil.ReadAll(transform.NewReader(
  156. bytes.NewReader(data), simplifiedchinese.GB18030.NewDecoder()))
  157. if err != nil {
  158. return "", err
  159. }
  160. return utils.BytesToString(text), nil
  161. }