Comment concaténer des octets dans Crystal
Je teste la sérialisation avec des octets ou des tranches, juste en apprenant et en essayant. Je voudrais lier 3 paramètres dans un seul champ de 10 octets, mais je ne sais pas maintenant comment les concaténer dans Crystal ou si c'est possible. Je sais que je peux y parvenir en créant des tableaux ou des tuples, mais je veux essayer de savoir s'il est possible de mélanger les paramètres dans un seul tampon.
Par exemple, je veux un ID d'enregistrement binaire auto-descriptif mélangeant 3 paramètres:
Type (UInt8) | Catégorie (UInt8) | Microsecondes (UInt64) = Total 80 bits - 10 octets
type = 1_u8 # 1 byte
categ = 4_u8 # 1 byte
usec = 1527987703211000_u64 # 8 bytes (Epoch)
Comment concaténer toutes ces variables dans un tampon continu de 10 octets?
Je veux récupérer les données par l'index, comme:
type = buff[0,1]
categ = buff[1,1]
usec = buff[2,8].to_u64 # (Actually not possible)
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
Ceci montre un exemple adapté à votre cas d'utilisation, mais IO::Memory
devrait être utilisé pour "concaténer des octets" en général - il suffit d'écrire dessus.