Pular para o conteúdo

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 leitura

O 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: cabe

Bytes 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"