added uint48
This commit is contained in:
98
bin.go
98
bin.go
@@ -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 (
|
||||
|
||||
Reference in New Issue
Block a user