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
|
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.
|
// GetUint64 - читает из массива arr 8 байт и декодирует их в uint64.
|
||||||
func GetUint64(arr []byte, byteOrder ByteOrder) (num uint64, err error) {
|
func GetUint64(arr []byte, byteOrder ByteOrder) (num uint64, err error) {
|
||||||
if len(arr) < 8 {
|
if len(arr) < 8 {
|
||||||
@@ -384,6 +404,32 @@ func PutUint32(arr []byte, num uint32, byteOrder ByteOrder) (err error) {
|
|||||||
return
|
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
|
// PutUint64 - записывает 8 байт в массив arr
|
||||||
func PutUint64(arr []byte, num uint64, byteOrder ByteOrder) (err error) {
|
func PutUint64(arr []byte, num uint64, byteOrder ByteOrder) (err error) {
|
||||||
if len(arr) < 8 {
|
if len(arr) < 8 {
|
||||||
@@ -617,6 +663,33 @@ func WriteUint32(w io.Writer, num uint32, byteOrder ByteOrder) (err error) {
|
|||||||
return
|
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 байт
|
// WriteUint64 - записывает в Writer 8 байт
|
||||||
func WriteUint64(w io.Writer, num uint64, byteOrder ByteOrder) (err error) {
|
func WriteUint64(w io.Writer, num uint64, byteOrder ByteOrder) (err error) {
|
||||||
switch byteOrder {
|
switch byteOrder {
|
||||||
@@ -873,6 +946,31 @@ func ReadUint32(src io.ByteReader, byteOrder ByteOrder) (num uint32, err error)
|
|||||||
return
|
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.
|
// ReadUint64 - читает из ByteReader arr 8 байт и декодирует их в uint64.
|
||||||
func ReadUint64(src io.ByteReader, byteOrder ByteOrder) (num uint64, err error) {
|
func ReadUint64(src io.ByteReader, byteOrder ByteOrder) (num uint64, err error) {
|
||||||
var (
|
var (
|
||||||
|
|||||||
Reference in New Issue
Block a user