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 resolve | O que falta | |
|---|---|---|
Arcane.Bytes | empacota 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.C | estrutura e ponteiro de verdade | é FFI: exige uma biblioteca nativa carregada |
Arcane.Estrutura | campos nomeados, alinhamento, janela, ponteiro | nã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 // 5Um 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.