From 893d2b81d7543b1a9da721e3a91cc16c04f4cd1b Mon Sep 17 00:00:00 2001 From: dima <1.e4.kc6@gmail.com> Date: Sat, 16 Aug 2025 21:11:17 +0000 Subject: [PATCH] added some methods --- little/little.go | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++ little/little_test.go | 9 ------- 2 files changed, 75 insertions(+), 9 deletions(-) diff --git a/little/little.go b/little/little.go index 0c159c0..fc5a255 100644 --- a/little/little.go +++ b/little/little.go @@ -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 } diff --git a/little/little_test.go b/little/little_test.go index 0408281..a954257 100644 --- a/little/little_test.go +++ b/little/little_test.go @@ -8,15 +8,6 @@ import ( "testing" ) -const ( - 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 -) - func TestContants(t *testing.T) { fmt.Println(MinInt24 == -8388608) fmt.Println(MaxInt24 == 8388607)