셸 스크립트의 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
bc:
$ echo "ibase=16; FF" | bc
255
perl을 사용하는 경우:
$ perl -le 'print hex("FF");'
255
printf :
$ 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
'programing' 카테고리의 다른 글
Android 에뮬레이터(qemu-system-i386.exe)를 통한 높은 CPU 사용률 (0) | 2023.04.14 |
---|---|
WPF 응용 프로그램의 기본 글꼴을 설정하려면 어떻게 해야 합니까? (0) | 2023.04.14 |
WPF: 폭(및 높이)을 퍼센티지 값으로 설정 (0) | 2023.04.14 |
현재 아이폰/디바이스 모델을 판별하는 방법 (0) | 2023.04.14 |
SQL 네트워크 인터페이스, 오류: 50 - 로컬 데이터베이스 런타임 오류가 발생했습니다.자동 인스턴스를 만들 수 없습니다. (0) | 2023.04.14 |