ในเชลล์สคริปต์ UNIX ฉันจะใช้อะไรในการแปลงเลขฐานสิบเป็นเลขฐานสิบหกได้บ้าง ฉันคิดว่า od จะทำเคล็ดลับ แต่ก็ไม่รู้ว่าฉันกำลังป้อนตัวเลข ASCII
printf? ขั้นต้น! ใช้ตอนนี้ แต่มีอะไรอีกบ้าง?
ในเชลล์สคริปต์ UNIX ฉันจะใช้อะไรในการแปลงเลขฐานสิบเป็นเลขฐานสิบหกได้บ้าง ฉันคิดว่า od จะทำเคล็ดลับ แต่ก็ไม่รู้ว่าฉันกำลังป้อนตัวเลข ASCII
printf? ขั้นต้น! ใช้ตอนนี้ แต่มีอะไรอีกบ้าง?
คำตอบ:
echo "obase=16; 34" | bc
หากคุณต้องการกรองไฟล์จำนวนเต็มหนึ่งไฟล์ต่อบรรทัด:
( echo "obase=16" ; cat file_of_integers ) | bc
ibase=16
ต้องการทำเช่นนั้นชุด คุณอาจต้องการอ่านคู่มือเกี่ยวกับ bcสำหรับรายละเอียดเพิ่มเติม
พยายามprintf(1)
?
printf "%x\n" 34
22
อาจมีหลายวิธีในการทำเช่นนั้นด้วยฟังก์ชัน builtin ในเชลล์ทั้งหมด แต่จะพกพาได้น้อยกว่า ฉันไม่ได้ตรวจสอบข้อกำหนด POSIX sh เพื่อดูว่ามีความสามารถดังกล่าวหรือไม่
bc
คือ. ตัวอย่างเช่นการ238862874857408875879219909679752457540
ป้อนข้อมูล printf ทำให้เรามี "ผลลัพธ์ใหญ่เกินไป" วิธี BC ใช้งานได้ดีสำหรับสิ่งที่ใหญ่กว่ามาตรฐาน int / long / bigint
printf "%X"
bc
ไม่สามารถใช้งานได้ทุกที่ (อย่างน้อยก็ไม่ใช่ใน Linux ที่ฝังไว้ของฉัน)
เลขฐานสิบหกถึงทศนิยม:
$ echo $((0xfee10000))
4276158464
ทศนิยมเป็นเลขฐานสิบหก:
$ printf '%x\n' 26
1a
bash-4.2$ printf '%x\n' 4294967295
ffffffff
bash-4.2$ printf -v hex '%x' 4294967295
bash-4.2$ echo $hex
ffffffff
ขออภัยความผิดของฉันลองสิ่งนี้ ...
#!/bin/bash
:
declare -r HEX_DIGITS="0123456789ABCDEF"
dec_value=$1
hex_value=""
until [ $dec_value == 0 ]; do
rem_value=$((dec_value % 16))
dec_value=$((dec_value / 16))
hex_digit=${HEX_DIGITS:$rem_value:1}
hex_value="${hex_digit}${hex_value}"
done
echo -e "${hex_value}"
ตัวอย่าง:
$ ./dtoh 1024
400
printf
และhex
คำสั่งไม่พร้อมใช้งาน
printf
ไม่มีจำหน่ายที่ไหน
ลอง:
printf "%X\n" ${MY_NUMBER}
ในzsh
ที่คุณสามารถทำเรียงของสิ่งนี้:
% typeset -i 16 y
% print $(( [#8] x = 32, y = 32 ))
8#40
% print $x $y
8#40 16#20
% setopt c_bases
% print $y
0x20
ตัวอย่างที่นำมาจากหน้าเอกสารเกี่ยวกับเลขคณิตประเมินผลzsh
ฉันเชื่อว่า Bash มีความสามารถที่คล้ายกัน
ในกรณีของฉันฉันพบปัญหาหนึ่งเกี่ยวกับการใช้โซลูชัน printf:
$ printf "%x" 008
bash: printf: 008: invalid octal number
วิธีที่ง่ายที่สุดคือการใช้โซลูชันกับbcซึ่งแนะนำในโพสต์ที่สูงกว่า:
$ bc <<< "obase=16; 008"
8
xd() {
printf "hex> "
while read i
do
printf "dec $(( 0x${i} ))\n\nhex> "
done
}
dx() {
printf "dec> "
while read i
do
printf 'hex %x\n\ndec> ' $i
done
}
# number conversion.
while `test $ans='y'`
do
echo "Menu"
echo "1.Decimal to Hexadecimal"
echo "2.Decimal to Octal"
echo "3.Hexadecimal to Binary"
echo "4.Octal to Binary"
echo "5.Hexadecimal to Octal"
echo "6.Octal to Hexadecimal"
echo "7.Exit"
read choice
case $choice in
1) echo "Enter the decimal no."
read n
hex=`echo "ibase=10;obase=16;$n"|bc`
echo "The hexadecimal no. is $hex"
;;
2) echo "Enter the decimal no."
read n
oct=`echo "ibase=10;obase=8;$n"|bc`
echo "The octal no. is $oct"
;;
3) echo "Enter the hexadecimal no."
read n
binary=`echo "ibase=16;obase=2;$n"|bc`
echo "The binary no. is $binary"
;;
4) echo "Enter the octal no."
read n
binary=`echo "ibase=8;obase=2;$n"|bc`
echo "The binary no. is $binary"
;;
5) echo "Enter the hexadecimal no."
read n
oct=`echo "ibase=16;obase=8;$n"|bc`
echo "The octal no. is $oct"
;;
6) echo "Enter the octal no."
read n
hex=`echo "ibase=8;obase=16;$n"|bc`
echo "The hexadecimal no. is $hex"
;;
7) exit
;;
*) echo "invalid no."
;;
esac
done
นี่ไม่ใช่เชลล์สคริปต์ แต่เป็นเครื่องมือ cli ที่ฉันใช้เพื่อแปลงตัวเลขระหว่าง bin / oct / dec / hex:
#!/usr/bin/perl
if (@ARGV < 2) {
printf("Convert numbers among bin/oct/dec/hex\n");
printf("\nUsage: base b/o/d/x num num2 ... \n");
exit;
}
for ($i=1; $i<@ARGV; $i++) {
if ($ARGV[0] eq "b") {
$num = oct("0b$ARGV[$i]");
} elsif ($ARGV[0] eq "o") {
$num = oct($ARGV[$i]);
} elsif ($ARGV[0] eq "d") {
$num = $ARGV[$i];
} elsif ($ARGV[0] eq "h") {
$num = hex($ARGV[$i]);
} else {
printf("Usage: base b/o/d/x num num2 ... \n");
exit;
}
printf("0x%x = 0d%d = 0%o = 0b%b\n", $num, $num, $num, $num);
}