added WriteVarSize/ReadVarSize

This commit is contained in:
2023-09-19 18:47:29 +03:00
parent 84931a31d6
commit 7d33ca486a

42
bin.go
View File

@@ -995,6 +995,48 @@ func ReadVarUint64(src io.ByteReader) (num uint64, err error) {
return return
} }
func WriteVarSize(w io.Writer, n int) (_ int, err error) {
num := uint64(n)
arr := make([]byte, 9)
for i := 0; i < 8; i++ {
arr[i] = byte(num & 127)
num >>= 7
if num == 0 {
arr[i] |= 128
i++
return w.Write(arr[:i])
}
}
// в последнем 9м байте все биты значащие
arr[8] = byte(num)
return w.Write(arr)
}
func ReadVarSize(src io.ByteReader) (_ int, err error) {
var (
b byte
num uint64
)
for i := 0; i < 8; i++ {
b, err = src.ReadByte()
if err != nil {
return
}
if b >= 128 {
num |= uint64(b&127) << uint(i*7)
return
}
num |= uint64(b) << uint(i*7)
}
b, err = src.ReadByte()
if err != nil {
return
}
// в последнем 9м байте все биты значащие
num |= uint64(b) << 56
return int(num), nil
}
///////////////// НУЖНЫ ЛИ ? ///////////////// НУЖНЫ ЛИ ?
/* /*
WriteMaxUint64 - кодирует число минимально возможным количеством байт (от 1 до 8). WriteMaxUint64 - кодирует число минимально возможным количеством байт (от 1 до 8).