added WriteVarInt64 ReadVarInt64

This commit is contained in:
2026-06-08 15:56:02 +03:00
parent 101b10d92a
commit 78363e9036
3 changed files with 76 additions and 15 deletions

View File

@@ -3,7 +3,6 @@ package bin
import (
"bytes"
"fmt"
"math"
"strconv"
"testing"
"time"
@@ -655,7 +654,11 @@ func TestInt32(t *testing.T) {
byteOrder := HL
err := WriteInt32(buf, ^math.MaxInt32, byteOrder)
//var origin int32 = -2147483648
//var origin int32 = math.MaxInt32
var origin int32 = 12141132
err := WriteInt32(buf, origin, byteOrder)
if err != nil {
t.Fatal(err)
}

View File

@@ -917,7 +917,24 @@ func GetBool(a []byte) (bool, error) {
}
}
// VAR
func WriteBool(w io.Writer, flag bool) (err error) {
var b byte
if flag {
b = 1
}
_, err = w.Write([]byte{b})
return
}
func ReadBool(src io.Reader) (bool, error) {
b, err := ReadByte(src)
if err != nil {
return false, err
}
return b == 1, nil
}
// WRITE & READ VAR INT/UINT
// WriteVarUint32 - записывает в Writer от 1 до 5 байт, возвращает количество
// записанных байт. Порядок байт - от младшего к старшему. Значение последнего
@@ -940,7 +957,7 @@ func WriteVarUint32(w io.Writer, num uint32) (i int) {
// ReadVarUint32 - читает из io.Reader от 1 до 5 байт, и декодирует их в uint32.
func ReadVarUint32(src io.Reader) (num uint32, err error) {
var b byte
for i := 0; i < 5; i++ {
for i := range 5 {
b, err = ReadByte(src)
if err != nil {
return
@@ -997,21 +1014,16 @@ func ReadVarUint64(src io.Reader) (num uint64, err error) {
return
}
func WriteBool(w io.Writer, flag bool) (err error) {
var b byte
if flag {
b = 1
}
_, err = w.Write([]byte{b})
return
func WriteVarInt64(w io.Writer, num int64) (int, error) {
return WriteVarUint64(w, EncodeZigZag(num))
}
func ReadBool(src io.Reader) (bool, error) {
b, err := ReadByte(src)
func ReadVarInt64(r io.Reader) (int64, error) {
u64, err := ReadVarUint64(r)
if err != nil {
return false, err
return 0, err
}
return b == 1, nil
return DecodeZigZag(u64), nil
}
// READ/WRITE VAR SIZE

View File

@@ -907,6 +907,52 @@ func TestPutGetVarUint64(t *testing.T) {
}
}
// WRITE & READ VAR UINT64
func TestWriteReadVarUint64(t *testing.T) {
for _, testCase := range varUint64TestCases {
w := bytes.NewBuffer(nil)
putCount, err := WriteVarUint64(w, testCase.Num)
if err != nil {
t.Fatalf("put %d: %s\n", testCase.Num, err)
}
decoded, err := ReadVarUint64(w)
if err != nil {
t.Fatalf("get %d: %s\n", testCase.Num, err)
}
if decoded != testCase.Num {
t.Fatalf("num %d not equal decoded %d", testCase.Num, decoded)
}
if putCount != testCase.Count {
t.Fatalf("count %d not equal put count %d of num %d",
testCase.Count, putCount, testCase.Num)
}
}
}
// WRITE & READ VAR INT64
func TestWriteReadVarInt64(t *testing.T) {
for _, testCase := range varInt64TestCases {
w := bytes.NewBuffer(nil)
putCount, err := WriteVarInt64(w, testCase.Num)
if err != nil {
t.Fatalf("put %d: %s\n", testCase.Num, err)
}
decoded, err := ReadVarInt64(w)
if err != nil {
t.Fatalf("get %d: %s\n", testCase.Num, err)
}
if decoded != testCase.Num {
t.Fatalf("num %d not equal decoded %d", testCase.Num, decoded)
}
if putCount != testCase.Count {
t.Fatalf("count %d not equal put count %d of num %d",
testCase.Count, putCount, testCase.Num)
}
}
}
// WRITE & READ VAR SIZE
func TestWriteReadVarSize(t *testing.T) {