Как объединить байты в Crystal - PullRequest
0 голосов
/ 03 июня 2018

Я тестирую сериализацию с байтами или слайсами, просто учусь и пробую.Я хотел бы связать 3 параметра в одном 10-байтовом поле, но я не знаю, как объединить их в Crystal или возможно ли это.Я знаю, что могу добиться этого, создавая массивы или кортежи, но я хочу попробовать, возможно ли смешивать параметры в одном буфере.

Например, я хочу, чтобы смешивание идентификатора двоичной записи с самоописанием 3параметры:

Тип (UInt8) |Категория (UInt8) |Микросекунды (UInt64) = Всего 80 бит - 10 байтов

type = 1_u8 # 1 byte
categ = 4_u8 # 1 byte
usec = 1527987703211000_u64 # 8 bytes (Epoch)

Как объединить все эти переменные в непрерывный 10-байтовый буфер?

Я хочу получить данные по индексу,как:

type = buff[0,1]
categ = buff[1,1]
usec = buff[2,8].to_u64 # (Actually not possible)

1 Ответ

0 голосов
/ 03 июня 2018
typ = 1_u8 # 1 byte
categ = 4_u8 # 1 byte
usec = 1527987703211000_u64 # 8 bytes (Epoch)

FORMAT = IO::ByteFormat::LittleEndian

io = IO::Memory.new(10)  # Specifying the capacity is optional

io.write_bytes(typ, FORMAT)  # Specifying the format is optional
io.write_bytes(categ, FORMAT)
io.write_bytes(usec, FORMAT)

buf = io.to_slice
puts buf

# --------

io2 = IO::Memory.new(buf)

typ2 = io2.read_bytes(UInt8, FORMAT)
categ2 = io2.read_bytes(UInt8, FORMAT)
usec2 = io2.read_bytes(UInt64, FORMAT)

pp typ2, categ2, usec2
Bytes[1, 4, 248, 99, 69, 92, 178, 109, 5, 0]
typ2   # => 1_u8
categ2 # => 4_u8
usec2  # => 1527987703211000_u64

Это показывает пример, адаптированный к вашему варианту использования, но IO::Memory в общем случае следует использовать для "объединения байтов" - просто напишите в него.

...