셸 스크립트의 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 |