O problema é que os bytes nulos não podem ser passados pelos argumentos da linha de comandos, pois são usados internamente como terminadores de argumentos. Todos os outros bytes parecem estar bem. Portanto, uma alternativa um pouco mais eficiente em termos de espaço (normalmente) ao uso de base64
seria escapar dos bytes nulos e, em seguida, usar printf
para converter os dados para o formato original:
pngString="$(sed 's/\/\\/g;s/%/%%/g;s/\x00/\x00/g' <example.png)"
printf "$pngString" >tmp.png
Os caracteres \
e %
são especiais para printf
, portanto, precisam também ter escape.
Observe também que, se os dados de entrada terminarem com uma nova linha, serão removidos pela substituição de comandos. Isso não deve ser um problema específico para PNGs, pois o último byte em um PNG válido deve ser 0x82, o byte menos significativo na soma de CRC do IEND
chunk vazio.