programing

셸 스크립트의 16진수부터 10진수까지

megabox 2023. 4. 14. 21:35
반응형

셸 스크립트의 16진수부터 10진수까지

셸 스크립트에서 16진수를 10진수로 변환하는 데 도움을 줄 수 있나요?

예: 16진수를 변환하고 싶다bfca3000셸 스크립트를 사용하여 10진수를 지정합니다.나는 기본적으로 두 16진수의 차이를 원한다.

암호는 다음과 같습니다.

var3=`echo "ibase=16; $var1" | bc`
var4=`echo "ibase=16; $var2" | bc`
var5=$(($var4-$var3))               # [Line 48]

실행 시 다음 오류가 나타납니다.

Line 48: -: syntax error: operand expected (error token is "-")

16진수에서 10진수로 변환하려면 셸 내에서 또는 외부 프로그램을 사용하여 여러 가지 방법으로 변환할 수 있습니다.

bash :

$ echo $((16#FF))
255

:

$ echo "ibase=16; FF" | bc
255

perl을 사용하는 :

$ perl -le 'print hex("FF");'
255

:

$ printf "%d\n" 0xFF
255

python :

$ python -c 'print(int("FF", 16))'
255

루비 :

$ ruby -e 'p "FF".to_i(16)'
255

:

$ nodejs <<< "console.log(parseInt('FF', 16))"
255

코뿔소 :

$ rhino<<EOF
print(parseInt('FF', 16))
EOF
...
255

포함:

$ groovy -e 'println Integer.parseInt("FF",16)'
255

Linux에서 매우 가벼운 내장형 busybox를 사용한다는 것은 많은 기존 명령어(bc, printf, dc, perl, python)를 사용할 수 없다는 것을 의미합니다.

echo $((0x2f))
47

hexNum=2f
echo $((0x${hexNum}))
47

이 솔루션에 대해 Peter Leung의 공로를 인정합니다.

셸을 사용하여 작업을 수행하는 다른 방법(대시 또는 ksh는 대시와 함께 사용할 수 없습니다):

echo $((16#FF))
255

셸 내에서 다양한 도구를 사용할 수 있습니다.Sputnick은 당신의 초기 질문에 기초하여 당신의 옵션에 대한 훌륭한 개요를 제공했습니다.여러 번 정답을 맞힌 시간만큼 표를 받을 만합니다.

리스트에 없는 게 하나 더 있어요

[ghoti@pc ~]$ dc -e '16i BFCA3000 p'
3217698816

하지만 뺄셈만 하고 싶다면 입력을 10진법으로 바꾸는 게 어때요?

[ghoti@pc ~]$ dc -e '16i BFCA3000 17FF - p 10o p'
3217692673
BFCA1801
[ghoti@pc ~]$ 

dc명령어는 "desk calc"입니다.stdin으로부터의 입력도 받습니다.bc단, "작업 순서"를 사용하는 대신 스태킹("역 폴란드어") 표기법을 사용합니다.스택에 추가할 입력을 입력한 다음 스택에서 항목을 팝업하고 결과를 푸시하는 연산자를 지정합니다.

위의 명령어에는 다음이 있습니다.

  • 16i ---dc에 베이스 16(1진수)의 입력을 받아들이도록 지시합니다.출력 베이스는 변경되지 않습니다.
  • BFCA3000 --초기번호
  • 17FF --당신의 첫 번째 숫자에서 빼기 위해 선택한 임의의 16진수입니다.
  • - -- 푸시한 2개의 숫자를 이전 숫자에서 뺀 후 결과를 스택에 다시 푸시합니다.
  • p --스택의 마지막 항목을 인쇄합니다.이렇게 해도 스택은 바뀌지 않아요, 그러니...
  • 10o --는 dc에 출력을 "10"으로 출력하도록 지시하지만 입력 번호 체계는 현재 16진수이므로 "10"은 "16"을 의미합니다.
  • p --스택의 마지막 항목을 다시 인쇄합니다.이번에는 16진수로.

dc로 엄청나게 복잡한 수학 해법을 만들 수 있습니다.셸 스크립트용 툴박스에 있는 것이 좋습니다.

대시 및 기타 셸에서는

printf "%d\n" (your hexadecimal number)

16진수를 10진수로 변환합니다.이는 bash 또는 ksh에만 해당되지 않습니다.

변수가 null(또는 빈)인 경우 보고된 오류 메시지가 나타납니다.

$ unset var3 var4; var5=$(($var4-$var3))
bash: -: syntax error: operand expected (error token is "-")

이는 bc에 주어진 값이 잘못되었기 때문에 발생할 수 있습니다.값이 필요하기 수 있습니다.bc에는 UPERCASE 값이 필요합니다.은 필요하다BFCA3000 아니라, 이에요.bfca3000 수 .bash를 하면 됩니다.^^★★★★

var3=bfca3000; var3=`echo "ibase=16; ${var1^^}" | bc`

그러면 스크립트가 다음과 같이 변경됩니다.

#!/bin/bash

var1="bfca3000"
var2="efca3250"

var3="$(echo "ibase=16; ${var1^^}" | bc)"
var4="$(echo "ibase=16; ${var2^^}" | bc)"

var5="$(($var4-$var3))"

echo "Diference $var5"

단, bash는 번역과 서브섹션을 직접 수행할 수 있으므로 bc [1]를 사용할 필요는 없습니다.

#!/bin/bash

var1="bfca3000"
var2="efca3250"

var5="$(( 16#$var2 - 16#$var1 ))"

echo "Diference $var5"

[1]Note: I am assuming the values could be represented in 64 bit math, as the difference was calculated in bash in your original script. Bash is limited to integers less than ((2**63)-1) if compiled in 64 bits. That will be the only difference with bc which does not have such limit.

가장 빠른 방법:

$ echo $[0x3F]
63

에는 $PATH를 필터링하기 위한 .0x1337- - 를를 - - - - - - - 、1337 는 ;"0x1337"문자열 행): 10진수 문자열 입력 행(명확성을 위해 추가):

#!/usr/bin/env bash

while read data; do
  withoutQuotes=`echo ${data} | sed s/\"//g`
  without0x=`echo ${withoutQuotes} | sed s/0x//g`
  clean=${without0x}
  echo $((16#${clean}))
done

언급URL : https://stackoverflow.com/questions/13280131/hexadecimal-to-decimal-in-shell-script

반응형