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
|
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).
|
||||||
|
|||||||
Reference in New Issue
Block a user