added uint48

This commit is contained in:
2024-12-27 08:15:07 +02:00
parent e9268f0c1f
commit fccca0b753

98
bin.go
View File

@@ -228,6 +228,26 @@ func GetUint32(arr []byte, byteOrder ByteOrder) (num uint32, err error) {
return
}
func GetUint48(arr []byte, byteOrder ByteOrder) (num uint64, err error) {
if len(arr) < 6 {
err = fmt.Errorf(wrongArraySize, len(arr))
return
}
switch byteOrder {
case LH:
num = uint64(arr[0]) | (uint64(arr[1]) << 8) |
(uint64(arr[2]) << 16) | (uint64(arr[3]) << 24) |
(uint64(arr[4]) << 32) | (uint64(arr[5]) << 40)
case HL:
num = uint64(arr[5]) | (uint64(arr[4]) << 8) |
(uint64(arr[3]) << 16) | (uint64(arr[2]) << 24) |
(uint64(arr[1]) << 32) | (uint64(arr[0]) << 40)
default:
err = fmt.Errorf(unknownByteOrder, byteOrder)
}
return
}
// GetUint64 - читает из массива arr 8 байт и декодирует их в uint64.
func GetUint64(arr []byte, byteOrder ByteOrder) (num uint64, err error) {
if len(arr) < 8 {
@@ -384,6 +404,32 @@ func PutUint32(arr []byte, num uint32, byteOrder ByteOrder) (err error) {
return
}
func PutUint48(arr []byte, num uint64, byteOrder ByteOrder) (err error) {
if len(arr) < 6 {
err = fmt.Errorf(wrongArraySize, len(arr))
return
}
switch byteOrder {
case LH:
arr[0] = byte(num)
arr[1] = byte(num >> 8)
arr[2] = byte(num >> 16)
arr[3] = byte(num >> 24)
arr[4] = byte(num >> 32)
arr[5] = byte(num >> 40)
case HL:
arr[5] = byte(num)
arr[4] = byte(num >> 8)
arr[3] = byte(num >> 16)
arr[2] = byte(num >> 24)
arr[1] = byte(num >> 32)
arr[0] = byte(num >> 40)
default:
err = fmt.Errorf(unknownByteOrder, byteOrder)
}
return
}
// PutUint64 - записывает 8 байт в массив arr
func PutUint64(arr []byte, num uint64, byteOrder ByteOrder) (err error) {
if len(arr) < 8 {
@@ -617,6 +663,33 @@ func WriteUint32(w io.Writer, num uint32, byteOrder ByteOrder) (err error) {
return
}
// WriteUint48 - записывает в Writer 6 байт
func WriteUint48(w io.Writer, num uint64, byteOrder ByteOrder) (err error) {
switch byteOrder {
case LH:
_, err = w.Write([]byte{
byte(num),
byte(num >> 8),
byte(num >> 16),
byte(num >> 24),
byte(num >> 32),
byte(num >> 40),
})
case HL:
_, err = w.Write([]byte{
byte(num >> 40),
byte(num >> 32),
byte(num >> 24),
byte(num >> 16),
byte(num >> 8),
byte(num),
})
default:
err = fmt.Errorf(unknownByteOrder, byteOrder)
}
return
}
// WriteUint64 - записывает в Writer 8 байт
func WriteUint64(w io.Writer, num uint64, byteOrder ByteOrder) (err error) {
switch byteOrder {
@@ -873,6 +946,31 @@ func ReadUint32(src io.ByteReader, byteOrder ByteOrder) (num uint32, err error)
return
}
// ReadUint48 - читает из ByteReader arr 6 байт и декодирует их в uint64.
func ReadUint48(src io.ByteReader, byteOrder ByteOrder) (num uint64, err error) {
var (
b byte
offsets []uint
)
switch byteOrder {
case LH:
offsets = offsets48LH
case HL:
offsets = offsets48HL
default:
err = fmt.Errorf(unknownByteOrder, byteOrder)
return
}
for _, off := range offsets {
b, err = src.ReadByte()
if err != nil {
return
}
num |= uint64(b) << off
}
return
}
// ReadUint64 - читает из ByteReader arr 8 байт и декодирует их в uint64.
func ReadUint64(src io.ByteReader, byteOrder ByteOrder) (num uint64, err error) {
var (