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 / 415077
Accepted
David Aubin
David Aubin
Asked: 2018-01-06 12:45:45 +0800 CST2018-01-06 12:45:45 +0800 CST 2018-01-06 12:45:45 +0800 CST

Como adicionar dois números hexadecimais em um script bash

  • 772

Eu quero adicionar duas variáveis ​​hexadecimais em um script bash. Eu quero que eles comecem como hexadecimais e terminem em hexadecimal, não decimal.

O que eu criei até agora é um pouco sobre hack. Existe uma solução melhor ou mais elegante?

BASE=0xA000

OFFSET=0x1000

NEW_BASE=$(( $BASE + $OFFSET ))

NEW_BASE=`printf "0x%X\n" $NEW_BASE`

echo $NEW_BASE

0xB000
bash shell-script
  • 5 5 respostas
  • 32644 Views

5 respostas

  • Voted
  1. Rui F Ribeiro
    2018-01-06T12:59:36+08:002018-01-06T12:59:36+08:00

    Eu apenas simplificaria seu script como:

    printf "0x%X\n" $((0xA000 + 0x1000))
    
    • 13
  2. Best Answer
    Stéphane Chazelas
    2018-01-06T14:44:22+08:002018-01-06T14:44:22+08:00

    Sim, em bash, printfé a única forma integrada de reformatar um número em uma base diferente e apenas as bases 8, 10 e 16 são suportadas.

    Em bash(ao contrário de shells como ksh93ou fish), usar a substituição de comando implica em bifurcar um subshell. Você pode usar printf -vaqui para evitar o subshell (também disponível em versões recentes de zshfor printe printf( print -f) que também suporta impressão em arrays):

    printf -v NEWBASE '%#X' "$((BASE + OFFSET))"
    

    (em bash, ao contrário de zsh, $((...))está sujeito à divisão de palavras, portanto, precisa ser citado para evitar a dependência de $IFS).

    Em zsh, você pode especificar a base de expansão como parte da sintaxe de expansão aritmética (bases 2 a 36):

    $ echo $(([#16] 0xff + 0xff))
    16#1FE
    $ echo $(([##16] 0xff + 0xff))
    1FE
    $ echo 0x$(([##16] 0xff + 0xff))
    0x1FE
    $ echo $(([##2] 0xff + 0xff))
    111111110
    

    Com ksh e zsh, você também pode forçar a expansão de uma variável inteira para uma base específica com:

    typeset -i 16 NEWBASE
    

    A expansão será na 16#1FEforma. ksh93 suporta bases até 64 zshe mkshaté 36.

    O built-in do ksh93 printf suporta a saída de números em bases arbitrárias, bem como com ou sem o n#prefixo:

    $ printf '%..2d\n' 0x1FE
    111111110
    $ printf '%#..2d\n' 0x1FE
    2#111111110
    

    Em ksh93, var=$(printf...)não bifurca um subshell, portanto é tão eficiente quanto bash's printf -v.

    • 7
  3. Wildcard
    2018-01-06T14:51:31+08:002018-01-06T14:51:31+08:00

    No GNU ou no BSD moderno dc, você pode fazer assim:

    echo A000 1000 | dc -e '16o16i?+p'
    

    16odefine a base de saída. 16idefine a base de entrada. As ?leituras em uma linha da entrada padrão, que neste caso coloca dois números na pilha. +os adiciona. pimprime o topo da pilha (a resposta).

    • 4
  4. francois P
    2018-01-06T12:50:29+08:002018-01-06T12:50:29+08:00

    dentro do bash, parece ser o bom método. você também pode chamar ferramentas como bc/dc (dependendo de suas preferências) ... echo 'obase=30; 123456' | bc

    mas eu prefiro o método bash No meu ponto de vista você está indo bem

    • 1
  5. Geremia
    2021-02-06T15:14:22+08:002021-02-06T15:14:22+08:00

    A soma de $hexNumAe $hexNumBé:

    printf "%x\n" $((16#$hexNumA + 16#$hexNumB))
    

    Você pode até adicionar decimal a hexadecimal com a mesma facilidade:

    printf "%x\n" $((16#$hexNum + $decNum))
    

    cortesia: " Converter Hexadecimal para Decimal no Bash "

    • 1

relate perguntas

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • MySQL Select com função IN () com array bash

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

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