added some methods
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user