mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2024-11-29 23:33:37 +00:00
628656483a
* Fixed TCP read + Uint256 reversed array + started on some core pieces * Disabled some debug output + muted test * 0.5.0
65 lines
1.4 KiB
Go
65 lines
1.4 KiB
Go
package util
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"errors"
|
|
"io"
|
|
)
|
|
|
|
// Variable length integer, can be encoded to save space according to the value typed.
|
|
// len 1 uint8
|
|
// len 3 0xfd + uint16
|
|
// len 5 0xfe = uint32
|
|
// len 9 0xff = uint64
|
|
// For more information about this:
|
|
// https://github.com/neo-project/neo/wiki/Network-Protocol
|
|
|
|
// ReadVarUint reads a variable unsigned integer and returns it as a uint64.
|
|
func ReadVarUint(r io.Reader) uint64 {
|
|
var b uint8
|
|
binary.Read(r, binary.LittleEndian, &b)
|
|
|
|
if b == 0xfd {
|
|
var v uint16
|
|
binary.Read(r, binary.LittleEndian, &v)
|
|
return uint64(v)
|
|
}
|
|
if b == 0xfe {
|
|
var v uint32
|
|
binary.Read(r, binary.LittleEndian, &v)
|
|
return uint64(v)
|
|
}
|
|
if b == 0xff {
|
|
var v uint64
|
|
binary.Read(r, binary.LittleEndian, &v)
|
|
return v
|
|
}
|
|
|
|
return uint64(b)
|
|
}
|
|
|
|
// WriteVarUint writes a variable unsigned integer.
|
|
func WriteVarUint(w io.Writer, val uint64) error {
|
|
if val < 0 {
|
|
return errors.New("value out of range")
|
|
}
|
|
if val < 0xfd {
|
|
binary.Write(w, binary.LittleEndian, uint8(val))
|
|
return nil
|
|
}
|
|
if val < 0xFFFF {
|
|
binary.Write(w, binary.LittleEndian, 0xfd)
|
|
binary.Write(w, binary.LittleEndian, uint16(val))
|
|
return nil
|
|
}
|
|
if val < 0xFFFFFFFF {
|
|
binary.Write(w, binary.LittleEndian, 0xfe)
|
|
binary.Write(w, binary.LittleEndian, uint32(val))
|
|
return nil
|
|
}
|
|
|
|
binary.Write(w, binary.LittleEndian, 0xff)
|
|
binary.Write(w, binary.LittleEndian, val)
|
|
|
|
return nil
|
|
}
|