Pular para o conteúdo

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