feat(bytepacket): 自 go-hua 迁入二进制封包工具
- 小端序读写, 兼容易语言协议(GBK 字符串/易语言日期) - 附测试、examples/bytepacket 例程与包 README
This commit is contained in:
@@ -0,0 +1,126 @@
|
||||
package bytepacket
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestIntReadWrite(t *testing.T) {
|
||||
p := NewPacket(nil)
|
||||
p.WriteInt8(-8)
|
||||
p.WriteUInt8(8)
|
||||
p.WriteInt16(-16)
|
||||
p.WriteUInt16(16)
|
||||
p.WriteInt32(-32)
|
||||
p.WriteUInt32(32)
|
||||
p.WriteInt64(-64)
|
||||
p.WriteUInt64(64)
|
||||
p.WriteFloat32(1.5)
|
||||
p.WriteFloat64(2.5)
|
||||
|
||||
r := NewPacket(p.GetData())
|
||||
if got := r.ReadInt8(); got != -8 {
|
||||
t.Errorf("ReadInt8 = %d, want -8", got)
|
||||
}
|
||||
if got := r.ReadUInt8(); got != 8 {
|
||||
t.Errorf("ReadUInt8 = %d, want 8", got)
|
||||
}
|
||||
if got := r.ReadInt16(); got != -16 {
|
||||
t.Errorf("ReadInt16 = %d, want -16", got)
|
||||
}
|
||||
if got := r.ReadUInt16(); got != 16 {
|
||||
t.Errorf("ReadUInt16 = %d, want 16", got)
|
||||
}
|
||||
if got := r.ReadInt32(); got != -32 {
|
||||
t.Errorf("ReadInt32 = %d, want -32", got)
|
||||
}
|
||||
if got := r.ReadUInt32(); got != 32 {
|
||||
t.Errorf("ReadUInt32 = %d, want 32", got)
|
||||
}
|
||||
if got := r.ReadInt64(); got != -64 {
|
||||
t.Errorf("ReadInt64 = %d, want -64", got)
|
||||
}
|
||||
if got := r.ReadUInt64(); got != 64 {
|
||||
t.Errorf("ReadUInt64 = %d, want 64", got)
|
||||
}
|
||||
if got := r.ReadFloat32(); got != 1.5 {
|
||||
t.Errorf("ReadFloat32 = %v, want 1.5", got)
|
||||
}
|
||||
if got := r.ReadFloat64(); got != 2.5 {
|
||||
t.Errorf("ReadFloat64 = %v, want 2.5", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestStringReadWrite(t *testing.T) {
|
||||
p := NewPacket(nil)
|
||||
if err := p.WriteString("hello"); err != nil {
|
||||
t.Fatalf("WriteString: %v", err)
|
||||
}
|
||||
if err := p.WriteStringGbk("中文GBK"); err != nil {
|
||||
t.Fatalf("WriteStringGbk: %v", err)
|
||||
}
|
||||
|
||||
r := NewPacket(p.GetData())
|
||||
s, err := r.ReadString()
|
||||
if err != nil || s != "hello" {
|
||||
t.Errorf("ReadString = %q, %v, want hello", s, err)
|
||||
}
|
||||
g, err := r.ReadStringGbk()
|
||||
if err != nil || g != "中文GBK" {
|
||||
t.Errorf("ReadStringGbk = %q, %v, want 中文GBK", g, err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBytesReadWrite(t *testing.T) {
|
||||
p := NewPacket(nil)
|
||||
want := []byte{1, 2, 3, 0xFF}
|
||||
if err := p.WriteBytes(want); err != nil {
|
||||
t.Fatalf("WriteBytes: %v", err)
|
||||
}
|
||||
got := NewPacket(p.GetData()).ReadBytes()
|
||||
if !bytes.Equal(got, want) {
|
||||
t.Errorf("ReadBytes = %v, want %v", got, want)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSetDataGetData(t *testing.T) {
|
||||
p := NewPacket(nil)
|
||||
p.SetData([]byte{9, 9})
|
||||
if !bytes.Equal(p.GetData(), []byte{9, 9}) {
|
||||
t.Errorf("GetData = %v, want [9 9]", p.GetData())
|
||||
}
|
||||
}
|
||||
|
||||
func TestGbkUtf8Convert(t *testing.T) {
|
||||
src := []byte("编码转换")
|
||||
gbk, err := Utf8ToGbk(src)
|
||||
if err != nil {
|
||||
t.Fatalf("Utf8ToGbk: %v", err)
|
||||
}
|
||||
utf8Bytes, err := GbkToUtf8(gbk)
|
||||
if err != nil {
|
||||
t.Fatalf("GbkToUtf8: %v", err)
|
||||
}
|
||||
if !bytes.Equal(utf8Bytes, src) {
|
||||
t.Errorf("GBK 往返不一致: %q != %q", utf8Bytes, src)
|
||||
}
|
||||
}
|
||||
|
||||
func TestReadElangDateTime(t *testing.T) {
|
||||
// 45292.5 天 ≈ 2024-01-01 12:00:00
|
||||
p := NewPacket(nil)
|
||||
p.WriteFloat64(45292.5)
|
||||
got := NewPacket(p.GetData()).ReadElangDateTime()
|
||||
if got.Format("2006-01-02 15:04:05") != "2024-01-01 12:00:00" {
|
||||
t.Errorf("ReadElangDateTime = %s, want 2024-01-01 12:00:00", got.Format("2006-01-02 15:04:05"))
|
||||
}
|
||||
}
|
||||
|
||||
func TestReadStringEmpty(t *testing.T) {
|
||||
p := NewPacket(nil)
|
||||
p.WriteInt16(0)
|
||||
s, err := NewPacket(p.GetData()).ReadString()
|
||||
if err != nil || s != "" {
|
||||
t.Errorf("ReadString 空串 = %q, %v", s, err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user