added some methods

This commit is contained in:
2025-08-16 21:11:17 +00:00
parent 8fb7478dc7
commit 893d2b81d7
2 changed files with 75 additions and 9 deletions

View File

@@ -12,6 +12,13 @@ import (
const ( const (
maxReadAttempts = 5 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 //Int32SignBit uint32 = 1 << 31
//Int64SignBit uint64 = 1 << 63 //Int64SignBit uint64 = 1 << 63
) )
@@ -24,6 +31,7 @@ var (
ErrNoSpace = errors.New("bin: no space") ErrNoSpace = errors.New("bin: no space")
ErrTooLong = errors.New("bin: too long") // слишком длинная строка или массив байт ErrTooLong = errors.New("bin: too long") // слишком длинная строка или массив байт
ErrRange = errors.New("bin: out of range")
) )
func ReadByteAsInt(r io.Reader) (i int, err error) { 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 байта // WriteInt24 - записывает в io.Writer 3 байта
func WriteInt24(w io.Writer, num int32) (err error) { func WriteInt24(w io.Writer, num int32) (err error) {
if num < MinInt24 || num > MaxInt24 {
return ErrRange
}
var sign byte var sign byte
if num < 0 { if num < 0 {
sign = 128 sign = 128
@@ -339,6 +350,9 @@ func WriteInt32(w io.Writer, num int32) (err error) {
// WriteInt48 - записывает в io.Writer 6 байт // WriteInt48 - записывает в io.Writer 6 байт
func WriteInt48(w io.Writer, num int64) (err error) { func WriteInt48(w io.Writer, num int64) (err error) {
if num < MinInt48 || num > MaxInt48 {
return ErrRange
}
var sign byte var sign byte
if num < 0 { if num < 0 {
sign = 128 sign = 128
@@ -380,6 +394,9 @@ func WriteUint16(w io.Writer, num uint16) (err error) {
// WriteUint24 - записывает в io.Writer 3 байта // WriteUint24 - записывает в io.Writer 3 байта
func WriteUint24(w io.Writer, num uint32) (err error) { func WriteUint24(w io.Writer, num uint32) (err error) {
if num > MaxUint24 {
return ErrRange
}
_, err = w.Write([]byte{ _, err = w.Write([]byte{
byte(num), byte(num),
byte(num >> 8), byte(num >> 8),
@@ -401,6 +418,9 @@ func WriteUint32(w io.Writer, num uint32) (err error) {
// WriteUint48 - записывает в io.Writer 6 байт // WriteUint48 - записывает в io.Writer 6 байт
func WriteUint48(w io.Writer, num uint64) (err error) { func WriteUint48(w io.Writer, num uint64) (err error) {
if num > MaxUint48 {
return ErrRange
}
_, err = w.Write([]byte{ _, err = w.Write([]byte{
byte(num), byte(num),
byte(num >> 8), byte(num >> 8),
@@ -457,6 +477,49 @@ func WriteString16(w io.Writer, str string) error {
return err 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 // PUT
func PutInt16(a []byte, num int16) error { 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 { func PutInt24(a []byte, num int32) error {
if num < MinInt24 || num > MaxInt24 {
return ErrRange
}
if len(a) < 3 { if len(a) < 3 {
return ErrNoSpace return ErrNoSpace
} }
@@ -494,6 +560,9 @@ func PutInt32(a []byte, num int32) error {
} }
func PutInt48(a []byte, num int64) error { func PutInt48(a []byte, num int64) error {
if num < MinInt48 || num > MaxInt48 {
return ErrRange
}
if len(a) < 6 { if len(a) < 6 {
return ErrNoSpace return ErrNoSpace
} }
@@ -535,6 +604,9 @@ func PutUint16(a []byte, num uint16) error {
} }
func PutUint24(a []byte, num uint32) error { func PutUint24(a []byte, num uint32) error {
if num > MaxUint24 {
return ErrRange
}
if len(a) < 3 { if len(a) < 3 {
return ErrNoSpace return ErrNoSpace
} }
@@ -556,6 +628,9 @@ func PutUint32(a []byte, num uint32) error {
} }
func PutUint48(a []byte, num uint64) error { func PutUint48(a []byte, num uint64) error {
if num > MaxUint48 {
return ErrRange
}
if len(a) < 6 { if len(a) < 6 {
return ErrNoSpace return ErrNoSpace
} }

View File

@@ -8,15 +8,6 @@ import (
"testing" "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) { func TestContants(t *testing.T) {
fmt.Println(MinInt24 == -8388608) fmt.Println(MinInt24 == -8388608)
fmt.Println(MaxInt24 == 8388607) fmt.Println(MaxInt24 == 8388607)