Pular para o conteúdo

Estruturas e ponteiros

Layout binário com campos nomeados, alinhamento conferido, janela que não copia e ponteiro com aritmética por elemento.

A linguagem já tinha duas respostas para bytes, e faltava a do meio.

O que resolveO que falta
Arcane.Bytesempacota e desempacota por formato: '>i32 u16'não tem nome — o resultado é posicional, e dados[3] três meses depois não diz nada
Arcane.Cestrutura e ponteiro de verdadeé FFI: exige uma biblioteca nativa carregada
Arcane.Estruturacampos nomeados, alinhamento, janela, ponteironão fala com o C — para isso é o Arcane.C

Ler o cabeçalho de um PNG não deveria exigir ctypes.

dataforge
adopt Arcane.Estrutura as Est

steady Cabecalho := Est.definir("Cabecalho", [
    ["magia", "u32"],
    ["versao", "u16"],
    ["registros", "u16"]
], ordem := "rede")

c := Cabecalho.ler(dados)
out c["versao"]

A ordem dos bytes é obrigatória#

O alinhamento é declarado, e conferido#

dataforge
Alinhado := Est.definir("Pacote", [["a", "u8"], ["b", "u32"]])
Junto := Est.definir("Pacote", [["a", "u8"], ["b", "u32"]],
    empacotado := yes)

out Alinhado.deslocamento("b")     // 4  o C insere 3 bytes de enchimento
out Alinhado.tamanho               // 8
out Junto.deslocamento("b")        // 1
out Junto.tamanho                  // 5

Um u32 começa num múltiplo de 4; um u64, num múltiplo de 8. Adivinhar aqui é o que faz o mesmo .struct sair com 12 bytes de um lado e 16 do outro. E o registro inteiro também é alinhado ao maior campo — sem isso, um cluster deles sai torto a partir do segundo.

molde.mapa() devolve a tabela do layout (campo, tipo, deslocamento, bytes) e molde.enchimento() diz quantos bytes são só alinhamento.

Onde continuar#