added some methods
This commit is contained in:
@@ -12,6 +12,13 @@ import (
|
||||
const (
|
||||
maxReadAttempts = 5
|
||||
|
||||
MinInt24 = -1 << 23 // -8388608
|
||||
MaxInt24 = 1<<23 - 1 // 8388607
|
||||
MinInt48 = -1 << 47 // -140737488355328
|
||||
MaxInt48 = 1<<47 - 1 // 140737488355327
|
||||
MaxUint24 = 1<<24 - 1 // 16777215
|
||||
MaxUint48 = 1<<48 - 1 // 281474976710655
|
||||
|
||||
//Int32SignBit uint32 = 1 << 31
|
||||
//Int64SignBit uint64 = 1 << 63
|
||||
)
|
||||
@@ -24,6 +31,7 @@ var (
|
||||
|
||||
ErrNoSpace = errors.New("bin: no space")
|
||||
ErrTooLong = errors.New("bin: too long") // слишком длинная строка или массив байт
|
||||
ErrRange = errors.New("bin: out of range")
|
||||
)
|
||||
|
||||
func ReadByteAsInt(r io.Reader) (i int, err error) {
|
||||
@@ -314,6 +322,9 @@ func WriteInt16(w io.Writer, num int16) (err error) {
|
||||
|
||||
// WriteInt24 - записывает в io.Writer 3 байта
|
||||
func WriteInt24(w io.Writer, num int32) (err error) {
|
||||
if num < MinInt24 || num > MaxInt24 {
|
||||
return ErrRange
|
||||
}
|
||||
var sign byte
|
||||
if num < 0 {
|
||||
sign = 128
|
||||
@@ -339,6 +350,9 @@ func WriteInt32(w io.Writer, num int32) (err error) {
|
||||
|
||||
// WriteInt48 - записывает в io.Writer 6 байт
|
||||
func WriteInt48(w io.Writer, num int64) (err error) {
|
||||
if num < MinInt48 || num > MaxInt48 {
|
||||
return ErrRange
|
||||
}
|
||||
var sign byte
|
||||
if num < 0 {
|
||||
sign = 128
|
||||
@@ -380,6 +394,9 @@ func WriteUint16(w io.Writer, num uint16) (err error) {
|
||||
|
||||
// WriteUint24 - записывает в io.Writer 3 байта
|
||||
func WriteUint24(w io.Writer, num uint32) (err error) {
|
||||
if num > MaxUint24 {
|
||||
return ErrRange
|
||||
}
|
||||
_, err = w.Write([]byte{
|
||||
byte(num),
|
||||
byte(num >> 8),
|
||||
@@ -401,6 +418,9 @@ func WriteUint32(w io.Writer, num uint32) (err error) {
|
||||
|
||||
// WriteUint48 - записывает в io.Writer 6 байт
|
||||
func WriteUint48(w io.Writer, num uint64) (err error) {
|
||||
if num > MaxUint48 {
|
||||
return ErrRange
|
||||
}
|
||||
_, err = w.Write([]byte{
|
||||
byte(num),
|
||||
byte(num >> 8),
|
||||
@@ -457,6 +477,49 @@ func WriteString16(w io.Writer, str string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// для записи timestamp-ов
|
||||
func WriteInt64AsUint32(w io.Writer, num int) error {
|
||||
if num < 0 || num > math.MaxUint32 {
|
||||
return ErrRange
|
||||
}
|
||||
return WriteUint32(w, uint32(num))
|
||||
}
|
||||
|
||||
// удобное кодирования длины
|
||||
func WriteIntAsByte(w io.Writer, num int) error {
|
||||
if num < 0 || num > math.MaxUint8 {
|
||||
return ErrRange
|
||||
}
|
||||
_, err := w.Write([]byte{
|
||||
byte(num),
|
||||
})
|
||||
return err
|
||||
}
|
||||
|
||||
// удобное кодирования длины
|
||||
func WriteIntAsUint16(w io.Writer, num int) error {
|
||||
if num < 0 || num > math.MaxUint16 {
|
||||
return ErrRange
|
||||
}
|
||||
return WriteUint16(w, uint16(num))
|
||||
}
|
||||
|
||||
// удобное кодирования длины
|
||||
func WriteIntAsUint24(w io.Writer, num int) error {
|
||||
if num < 0 || num > MaxUint24 {
|
||||
return ErrRange
|
||||
}
|
||||
return WriteUint24(w, uint32(num))
|
||||
}
|
||||
|
||||
// удобное кодирования длины
|
||||
func WriteIntAsUint32(w io.Writer, num int) error {
|
||||
if num < 0 || num > math.MaxUint32 {
|
||||
return ErrRange
|
||||
}
|
||||
return WriteUint32(w, uint32(num))
|
||||
}
|
||||
|
||||
// PUT
|
||||
|
||||
func PutInt16(a []byte, num int16) error {
|
||||
@@ -469,6 +532,9 @@ func PutInt16(a []byte, num int16) error {
|
||||
}
|
||||
|
||||
func PutInt24(a []byte, num int32) error {
|
||||
if num < MinInt24 || num > MaxInt24 {
|
||||
return ErrRange
|
||||
}
|
||||
if len(a) < 3 {
|
||||
return ErrNoSpace
|
||||
}
|
||||
@@ -494,6 +560,9 @@ func PutInt32(a []byte, num int32) error {
|
||||
}
|
||||
|
||||
func PutInt48(a []byte, num int64) error {
|
||||
if num < MinInt48 || num > MaxInt48 {
|
||||
return ErrRange
|
||||
}
|
||||
if len(a) < 6 {
|
||||
return ErrNoSpace
|
||||
}
|
||||
@@ -535,6 +604,9 @@ func PutUint16(a []byte, num uint16) error {
|
||||
}
|
||||
|
||||
func PutUint24(a []byte, num uint32) error {
|
||||
if num > MaxUint24 {
|
||||
return ErrRange
|
||||
}
|
||||
if len(a) < 3 {
|
||||
return ErrNoSpace
|
||||
}
|
||||
@@ -556,6 +628,9 @@ func PutUint32(a []byte, num uint32) error {
|
||||
}
|
||||
|
||||
func PutUint48(a []byte, num uint64) error {
|
||||
if num > MaxUint48 {
|
||||
return ErrRange
|
||||
}
|
||||
if len(a) < 6 {
|
||||
return ErrNoSpace
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user