Eu preciso converter uma lista de valores decimais em um arquivo de texto em formato hexadecimal, então, por exemplo, test.txt pode conter:
131072
196608
262144
327680
393216
...
a saída deve ser uma lista de valores hexadecimais (hex 8 dígitos, com zeros à esquerda):
00020000
00030000
00040000
...
a saída é impressa no arquivo de texto. Como fazer isso com script de shell python ou linux?
EDIÇÃO #1
Perdi uma operação extra: preciso adicionar 80000000
hexadecimal a cada um dos valores hexadecimais criados. (adição aritmética, para aplicar à lista já criada de valores hexadecimais).
Você pode fazer isso usando
printf
ebash
:Ou usando printf e bc... apenas... porque?
Para imprimir a saída em um arquivo de texto, basta usar o redirecionamento do shell
>
como:Três soluções possíveis (assumindo que cada linha é um conjunto de apenas dígitos):
Para shells como ksh, bash, zsh:
Somente para bash
Para shells mais simples: dash (o sh padrão em sistemas baseados em Debian), ash (shell emulado do busybox), yash e alguns shells padrão no AIX e Solaris:
Na verdade, para um shell como a versão de herança (como Bourne), ele precisa ser escrito como (que funciona em todos os shells posix listados acima, mas eu recomendo fortemente não usá-lo ):
Resposta para EDIT #1
Entenda que um valor hexadecimal de
80000000
causará estouro em um computador de 32 bits (não é comum hoje em dia, mas é possível). Verifique seecho "$((0x80000000))"
não imprime um valor negativo.Usando
awk
:Mais uma linha. Ainda não é python, mas permite comentários, linhas vazias e o que quer que esteja no arquivo, e apenas imprime o resultado para linhas que contêm apenas um número.
Dado um arquivo como este:
Ele imprime
Aqui estão algumas soluções de uma linha em PHP:
Usando Julia
Deve ser mais fácil ler várias linhas:
hex( value, pad)
converte um valor em hexadecimal e adiciona preenchimento conforme necessário.hexadd
requer integer como entrada, então convertemos strings (saída deeachline
) paraInt
withparse(Int,"string")
e usamos isso em nossa função.julia -e
avalia uma expressão.Usando CC:
Explicação:
dc -f test.txt -e '16o 16i [80000000 + p sa z 1 <r] sr z 1 <r 80000000 + p' > output.txt
-f file
empurrar o conteúdo do arquivo para a pilha-e
executar expressão16o
converter saída para base 1616i
assume entrada na base 16. Isso acontece depois de ler o arquivo, então o arquivo foi lido na base 10. Mais explicitamente eu poderia fazerdc -e '10i' -f file -e '16 i 8000000'
[...]
empurrar uma string para a pilha. Esta string será usada como uma macro.80000000 +
adicione o topo atual da pilha e hexadecimal 80000000. Empurre o resultado para o topo da pilha.p
Imprima o topo atual da pilha, sem estourar. Somente opção de impressão que imprime uma nova linha.sa
Pop e armazene o topo da pilha no registro 'a'. Nunca é usado, apenas uma maneira de se livrar do topo do saco.z
O topo atual da pilha agora tem a profundidade da pilha. Necessário para encerrar a chamada recursiva.1
empurre 1 para o topo da pilha. Útil em comparação com a profundidade da pilha (z) enviada anteriormente.<r
compare 2 valores da pilha, se o 2º for menor que o 1º, execute o registro 'r'. Na verdade, compare a profundidade da pilha e '1'.sr
pop e armazene no registrador 'r'. Agora a macro está no registrador 'r' e será executada enquanto a profundidade da pilha for maior que 1. Exceto que nada a chamou ainda.d
Duplique o topo da pilha e empurre.x
Execute o topo da pilha como macro.d sr x
Duplicar macro e push, agora a pilha tem 2 cópias, pop e store top copy para registrar, pop e executar a 2ª cópia...