代码拉取完成,页面将自动刷新
同步操作将从 coco/go808 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
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
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。