Campos de bits
Versão e tamanho do IPv4 no mesmo byte, as flags do TCP em 16 bits — com máscara, e nunca com o bitfield do C.
Protocolos economizam: o primeiro byte do cabeçalho IPv4 guarda dois campos — a versão nos 4 bits de cima e o tamanho do cabeçalho nos 4 de baixo. Est.campos_de_bits descreve isso com nome, e o primeiro campo é o de cima, como toda RFC desenha.
dataforge
adopt Arcane.Estrutura as Est
Ver_ihl := Est.campos_de_bits("Ver_ihl", [["versao", 4], ["ihl", 4]])
assert Ver_ihl.ler(0x45) is {"versao": 4, "ihl": 5} // IPv4, 5 palavras de 32 bits
assert Ver_ihl.juntar({"versao": 4, "ihl": 5}) is 0x45
out Ver_ihl.mapa()As flags do TCP#
dataforge
adopt Arcane.Estrutura as Est
Tcp := Est.campos_de_bits("Tcp", [
["deslocamento", 4], ["reservado", 3], ["ns", 1], ["cwr", 1], ["ece", 1],
["urg", 1], ["ack", 1], ["psh", 1], ["rst", 1], ["syn", 1], ["fin", 1]], 16)
syn_ack := Tcp.juntar({"deslocamento": 5, "syn": 1, "ack": 1})
assert syn_ack is 0x5012
flags := Tcp.ler(syn_ack)
assert flags["syn"] is 1 and flags["ack"] is 1 and flags["fin"] is 0