Postar meu comentário como uma resposta a ser marcada como "resolvida"
for n in $(cat myfile | tr 'a-f' 'A-F');do echo "obase=2; ibase=16; $n" | bc ;done
Ok, à luz do que você disse e do que entendi, tenho algumas sugestões para você. O primeiro, converte cada linha hexadecimal em uma nova linha binária e coloca uma quebra de linha no final de cada linha. aqui está essa solução:
cat myfile | while read line
do
len=${#line}
binline=""
index=1
while [ ${index} -le ${len} ]
do
hex=$(echo ${line} | cut -c ${index} | tr 'a-f' 'A-F')
bin=$(echo "obase=2; ibase=16; ${hex}"|bc)
padbin=$(printf "%04d" ${bin})
binline="${binline}${padbin}"
(( index++ ))
done
echo ${binline} >> program.bin
done
E, se não estou enganado, você está tentando usar esse arquivo binário como um programa para um sistema incorporado ou algo semelhante. Se esse for o caso, as quebras de linha podem representar um problema. Se for esse o caso, ou seja, você deseja o arquivo inteiro como uma única linha enorme, você pode usar o seguinte snippet:
cat myfile | while read line
do
len=${#line}
index=1
while [ ${index} -le ${len} ]
do
hex=$(echo ${line} | cut -c ${index} | tr 'a-f' 'A-F')
bin=$(echo "obase=2; ibase=16; ${hex}"|bc)
printf "%04d" ${bin} >> p2.bin
(( index++ ))
done
done
Tendo dito tudo isso, se o seu arquivo de valores hexadecimais estiver no tamanho de gigabytes ou até mesmo no tamanho de algumas centenas de megabytes, o bash irá reclamar e poderá lançar um erro críptico. Portanto, é de seu interesse cortar esse arquivo de entrada em partes mais gerenciáveis e processá-las peça por peça.
Por favor, note que eu escrevi estes scripts no mais simples para entender. Por isso, haverá algumas penalidades de desempenho quando você executá-las. 3 linhas leva cerca de 6 segundos de tempo de processamento. Cabe a você otimizá-lo, se você achar a espera intolerável.