added WriteReadVarSize test, added PutVarSize/GetVarSize and test
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user