added WriteReadVarSize test, added PutVarSize/GetVarSize and test

This commit is contained in:
2026-05-28 20:48:01 +00:00
parent 7fa2d0f292
commit 12b8905852
2 changed files with 158 additions and 44 deletions

View File

@@ -29,9 +29,10 @@ var (
// ErrNegativeReadCount shows 100% bug in the source reader
ErrNegativeReadCount = errors.New("bin: reader returned negative 'n'")
ErrNoSpace = errors.New("bin: no space")
ErrTooLong = errors.New("bin: too long") // слишком длинная строка или массив байт
ErrRange = errors.New("bin: out of range")
ErrNoSpace = errors.New("bin: no space")
ErrTooLong = errors.New("bin: too long") // слишком длинная строка или массив байт
ErrRange = errors.New("bin: out of range")
ErrNegativeSize = errors.New("bin: negative size")
)
func ReadByteAsInt(r io.Reader) (i int, err error) {
@@ -1013,10 +1014,16 @@ func ReadBool(src io.Reader) (bool, error) {
return b == 1, nil
}
// uint64
// READ/WRITE VAR SIZE
func WriteVarSize(w io.Writer, n int) (int, error) {
num := uint64(n)
a := make([]byte, 9)
if n < 0 {
return 0, ErrNegativeSize
}
var (
num = uint64(n)
a = make([]byte, 9)
)
for i := 0; i < 8; i++ {
a[i] = byte(num & 127)
num >>= 7
@@ -1100,3 +1107,55 @@ func CountVarSize(n int) int {
}
return 9
}
// PUT/GET VAR SIZE
func PutVarSize(a []byte, n int) (int, error) {
if n < 0 {
return 0, ErrNegativeSize
}
var (
num = uint64(n)
tmp = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0}
)
for i := 0; i < 8; i++ {
if i < len(a) {
if num < 128 {
tmp[i] = byte(num) | 128
q := i + 1
copy(a, tmp[:q])
return q, nil
}
tmp[i] = byte(num & 127)
num >>= 7
} else {
return 0, ErrNoSpace
}
}
if len(a) < 9 {
return 0, ErrNoSpace
}
tmp[8] = byte(num)
copy(a, tmp)
return 9, nil
}
func GetVarSize(a []byte) (int, error) {
var num uint64
for i := 0; i < 8; i++ {
if i < len(a) {
b := a[i]
num |= uint64(b&127) << uint(i*7)
if b >= 128 {
return int(num), nil
}
} else {
return 0, ErrNoSpace
}
}
if len(a) < 9 {
return 0, ErrNoSpace
}
num |= uint64(a[8]) << 56
return int(num), nil
}