1 Star 0 Fork 40

peng2289/go808

forked from coco/go808 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
bufio.go 3.21 KB
一键复制 编辑 原始数据 按行查看 历史
Your Name 提交于 2020-04-07 18:55 +08:00 . 添加数据压缩上报
package protocol
import (
"bytes"
"encoding/binary"
"golang.org/x/text/encoding/simplifiedchinese"
"golang.org/x/text/transform"
"io"
"io/ioutil"
"time"
)
type Writer struct {
b *bytes.Buffer
}
func NewWriter() Writer {
return Writer{b: bytes.NewBuffer(nil)}
}
func (writer *Writer) Bytes() []byte {
return writer.b.Bytes()
}
func (writer *Writer) Write(p []byte, size ...int) *Writer {
if len(size) == 0 {
writer.b.Write(p)
return writer
}
if len(p) >= size[0] {
writer.b.Write(p[:size[0]])
} else {
writer.b.Write(p)
end := size[0] - len(p)
for i := 0; i < end; i++ {
writer.b.WriteByte(0)
}
}
return writer
}
func (writer *Writer) WriteByte(b byte) *Writer {
writer.b.WriteByte(b)
return writer
}
func (writer *Writer) WriteUint16(n uint16) *Writer {
var buf [2]byte
binary.BigEndian.PutUint16(buf[:], n)
writer.b.Write(buf[:])
return writer
}
func (writer *Writer) WriteUint32(n uint32) *Writer {
var buf [4]byte
binary.BigEndian.PutUint32(buf[:], n)
writer.b.Write(buf[:])
return writer
}
func (writer *Writer) WriteBcdTime(t time.Time) *Writer {
writer.b.Write(toBCDTime(t))
return writer
}
func (writer *Writer) WritString(str string, size ...int) error {
reader := bytes.NewReader([]byte(str))
data, err := ioutil.ReadAll(
transform.NewReader(reader, simplifiedchinese.GB18030.NewEncoder()))
if err != nil {
return err
}
writer.Write(data, size...)
return nil
}
type Reader struct {
d []byte
r *bytes.Reader
}
func NewReader(data []byte) Reader {
return Reader{d: data, r: bytes.NewReader(data)}
}
func (reader *Reader) Len() int {
return reader.r.Len()
}
func (reader *Reader) Read(size ...int) ([]byte, error) {
num := reader.r.Len()
if len(size) > 0 {
num = size[0]
}
if num > reader.r.Len() {
return nil, io.ErrUnexpectedEOF
}
curr := len(reader.d) - reader.r.Len()
buf := reader.d[curr : curr+num]
reader.r.Seek(int64(num), io.SeekCurrent)
return buf, nil
}
func (reader *Reader) ReadByte() (byte, error) {
return reader.r.ReadByte()
}
func (reader *Reader) ReadUint16() (uint16, error) {
if reader.r.Len() < 2 {
return 0, io.ErrUnexpectedEOF
}
var buf [2]byte
n, err := reader.r.Read(buf[:])
if err != nil {
return 0, err
}
if n != len(buf) {
return 0, io.ErrUnexpectedEOF
}
return binary.BigEndian.Uint16(buf[:]), nil
}
func (reader *Reader) ReadUint32() (uint32, error) {
if reader.r.Len() < 4 {
return 0, io.ErrUnexpectedEOF
}
var buf [4]byte
n, err := reader.r.Read(buf[:])
if err != nil {
return 0, err
}
if n != len(buf) {
return 0, io.ErrUnexpectedEOF
}
return binary.BigEndian.Uint32(buf[:]), nil
}
func (reader *Reader) ReadBcdTime() (time.Time, error) {
if reader.r.Len() < 6 {
return time.Time{}, io.ErrUnexpectedEOF
}
var buf [6]byte
n, err := reader.r.Read(buf[:])
if err != nil {
return time.Time{}, err
}
if n != len(buf) {
return time.Time{}, io.ErrUnexpectedEOF
}
return fromBCDTime(buf[:])
}
func (reader *Reader) ReadString(size ...int) (string, error) {
data, err := reader.Read(size...)
if err != nil {
return "", err
}
text, err := ioutil.ReadAll(transform.NewReader(
bytes.NewReader(data), simplifiedchinese.GB18030.NewDecoder()))
if err != nil {
return "", err
}
return bytesToString(text), nil
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/oco/go808.git
git@gitee.com:oco/go808.git
oco
go808
go808
32b1471f79b9

搜索帮助