Texto de tamanho fixo
O char[N] do C: completado com zeros, lido até o primeiro zero — e o acento que não cabe.
Muitos formatos guardam texto num espaço de tamanho fixo: o código IHDR de um chunk PNG, o nome de 16 caracteres de um registro antigo. O campo char com N bytes é esse espaço: escreve completando com zeros, e lê até o primeiro zero.
dataforge
adopt Arcane.Estrutura as Est
adopt Arcane.Bytes as Bytes
Registro := Est.definir("Registro", [["codigo", "char", 4], ["nome", "char", 8]], "rede", yes)
b := Registro({"codigo": "AB", "nome": "Joana"})
assert Bytes.hex(b.bytes()) is "414200004a6f616e61000000" // os zeros completam
assert Registro.ler(b) is {"codigo": "AB", "nome": "Joana"} // e somem na leituraO limite é em bytes, não em letras#
O campo mede bytes em UTF-8, e um acento ocupa dois. "João" tem 4 letras e 5 bytes: não cabe num char de 4. Cortar em silêncio gravaria "Jo\xc3" — metade de um caractere, e um texto inválido. O molde recusa:
dataforge
adopt Arcane.Estrutura as Est
Nome := Est.definir("Nome", [["n", "char", 4]])
recusado := no
monitor:
Nome({"n": "João"})
handle BufferOverflowError as e:
recusado := yes
assert recusado
assert Nome.ler(Nome({"n": "Joã"}))["n"] is "Joã" // quatro bytes: cabeBytes crus#
bytes com N é o mesmo espaço, sem interpretação: a assinatura mágica de um arquivo, um hash, uma chave. Lê e escreve Bytes, e nunca corta no primeiro zero — porque ali o zero é dado.
dataforge
adopt Arcane.Estrutura as Est
adopt Arcane.Bytes as Bytes
Cab := Est.definir("Cab", [["magica", "bytes", 4], ["versao", "u8"]], "rede", yes)
b := Cab({"magica": Bytes.de_hex("7f454c46"), "versao": 2}) // a assinatura do ELF
assert Bytes.hex(Cab.ler(b)["magica"]) is "7f454c46"