From 7d33ca486a541189eaa5b6991e319dbcfc58a880 Mon Sep 17 00:00:00 2001 From: Dima Gordenko <1.e4.kc6@gmail.com> Date: Tue, 19 Sep 2023 18:47:29 +0300 Subject: [PATCH] added WriteVarSize/ReadVarSize --- bin.go | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/bin.go b/bin.go index bf7d1da..d6d42d3 100755 --- a/bin.go +++ b/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).