AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 457645
Accepted
minto
minto
Asked: 2018-07-22 05:29:07 +0800 CST2018-07-22 05:29:07 +0800 CST 2018-07-22 05:29:07 +0800 CST

Converter uma lista de valores decimais em um arquivo de texto em formato hexadecimal

  • 772

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 80000000hexadecimal a cada um dos valores hexadecimais criados. (adição aritmética, para aplicar à lista já criada de valores hexadecimais).

linux scripting
  • 6 6 respostas
  • 6572 Views

6 respostas

  • Voted
  1. Best Answer
    jesse_b
    2018-07-22T05:39:44+08:002018-07-22T05:39:44+08:00

    Você pode fazer isso usando printfe bash:

    printf '%08x\n' $(< test.txt)
    

    Ou usando printf e bc... apenas... porque?

    printf '%08s\n' $(bc <<<"obase=16; $(< test.txt)")
    

    Para imprimir a saída em um arquivo de texto, basta usar o redirecionamento do shell >como:

    printf '%08x\n' $(< test.txt) > output.txt
    
    • 13
  2. user232326
    2018-07-22T06:11:54+08:002018-07-22T06:11:54+08:00

    Três soluções possíveis (assumindo que cada linha é um conjunto de apenas dígitos):

    Para shells como ksh, bash, zsh:

    printf '%08x\n' $(<infile)
    

    Somente para bash

    <file.txt mapfile -t arr;   printf '%08x\n' "${arr[@]}" 
    

    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:

    printf '%08x\n' $(cat infile)
    

    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 ):

    $ printf '%08x\n' `cat infile`
    

    Resposta para EDIT #1

    Entenda que um valor hexadecimal de 80000000causará estouro em um computador de 32 bits (não é comum hoje em dia, mas é possível). Verifique se echo "$((0x80000000))"não imprime um valor negativo.

    $ for i in $(<infile); do printf '%08x\n' "$(($i+0x80000000))"; done
    80020000
    80030000
    80040000
    80050000
    80060000
    
    • 5
  3. Kusalananda
    2018-07-22T06:33:21+08:002018-07-22T06:33:21+08:00

    Usando awk:

    $ awk '/[0-9]/ { printf("%08x\n", $0) }' file
    00020000
    00030000
    00040000
    00050000
    00060000
    
    • 5
  4. mivk
    2018-07-22T10:34:35+08:002018-07-22T10:34:35+08:00

    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.

    perl -ne '/^(\d+)$/ && printf "%08x\n", $1'  $your_file
    

    Dado um arquivo como este:

    $ cat $your_file
    # some numbers,
    131072
    196608
    
    262144
    327680
    393216
    
    and empty lines
    and whatever...
    

    Ele imprime

    00020000
    00030000
    00040000
    00050000
    00060000
    
    • 2
  5. Zombo
    2018-07-22T20:44:14+08:002018-07-22T20:44:14+08:00

    Aqui estão algumas soluções de uma linha em PHP:

    <?php
    foreach (file('test.txt') as $s) echo dechex(+$s), "\n";
    
    <?php
    array_map(fn($s) => print dechex(+$s) . "\n", file('test.txt'));
    
    • 1
  6. Dani_l
    2018-07-22T23:34:30+08:002018-07-22T23:34:30+08:00

    Usando Julia

    $ julia -e 'function hexadd(x) hex(( x + 0x80000000),8) end ; output = open("output.txt","w") ; open("test.txt") do inputfile for num in eachline(inputfile) write(output,"$(hexadd(parse(Int,num)))\n") end end'
    

    Deve ser mais fácil ler várias linhas:

    function hexadd(x)
        hex(( x + 0x80000000),8)
    end
    output = open("output.txt","w")
    open("test.txt") do inputfile
        for num in eachline(inputfile)
            write(output,"$(hexadd(parse(Int,num)))\n")
        end
    end
    
    • hex( value, pad)converte um valor em hexadecimal e adiciona preenchimento conforme necessário.
      hexaddrequer integer como entrada, então convertemos strings (saída de eachline) para Intwith parse(Int,"string")e usamos isso em nossa função.
    • julia -eavalia uma expressão.
    • julia pode ser instalado nativamente no fedora, ubuntu

    Usando CC:

    $ dc -f test.txt -e '16o16i[80000000+psaz1<r]dsrx80000000+p' > output.txt
    

    Explicação:

    • dc -f test.txt -e '16o 16i [80000000 + p sa z 1 <r] sr z 1 <r 80000000 + p' > output.txt
    • -f fileempurrar o conteúdo do arquivo para a pilha
    • -eexecutar expressão
    • 16oconverter saída para base 16
    • 16iassume 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.
    • pImprima o topo atual da pilha, sem estourar. Somente opção de impressão que imprime uma nova linha.
    • saPop e armazene o topo da pilha no registro 'a'. Nunca é usado, apenas uma maneira de se livrar do topo do saco.
    • zO topo atual da pilha agora tem a profundidade da pilha. Necessário para encerrar a chamada recursiva.
    • 1empurre 1 para o topo da pilha. Útil em comparação com a profundidade da pilha (z) enviada anteriormente.
    • <rcompare 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'.
    • srpop 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.
    • dDuplique o topo da pilha e empurre.
    • xExecute o topo da pilha como macro.
    • d sr xDuplicar macro e push, agora a pilha tem 2 cópias, pop e store top copy para registrar, pop e executar a 2ª cópia...
    • Então, empurre a profundidade da pilha e 1, compare e execute e, para o último elemento, adicione novamente o valor hexadecimal e imprima.
    • 1

relate perguntas

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

  • Necessidade de algumas chamadas de sistema

  • Renomeie (acrescentar) arquivos CSV em massa com base em um valor dentro

  • astyle não altera a formatação do arquivo de origem

  • Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve