added WriteVarSize/ReadVarSize
This commit is contained in:
42
bin.go
42
bin.go
@@ -995,6 +995,48 @@ func ReadVarUint64(src io.ByteReader) (num uint64, err error) {
|
||||
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).
|
||||
|
||||
Reference in New Issue
Block a user