Adakah yang bisa membantu saya mengonversi angka heksadesimal menjadi angka desimal di skrip shell?
Misalnya, saya ingin mengonversi angka heksadesimal bfca3000
menjadi desimal menggunakan skrip shell. Saya pada dasarnya menginginkan perbedaan dua angka heksadesimal.
Kode saya adalah:
var3=`echo "ibase=16; $var1" | bc`
var4=`echo "ibase=16; $var2" | bc`
var5=$(($var4-$var3)) # [Line 48]
Saat menjalankan, saya mendapatkan kesalahan ini:
Line 48: -: syntax error: operand expected (error token is "-")
Jawaban:
Untuk mengkonversi dari hex ke desimal, ada banyak cara untuk melakukannya di shell atau dengan program eksternal:
Dengan pesta:
dengan bc:
dengan perl:
dengan printf :
dengan ular sanca:
dengan rubi:
dengan node.js:
dengan badak:
dengan asyik:
sumber
printf
solusinya POSIX? Jika ya, itu yang terbaik :)$((0xff))
, misalnya dengan awalan hex mirip-C alih-alih16#
, meskipunN#
jelas lebih umum.echo $((077E9F2DBF49D100001#FF))
meluap batas integer 64-bit 2 ^ 64.bc
menangani ini dengan benar.Berurusan dengan versi embeddedbox busybox yang sangat ringan di Linux berarti banyak perintah tradisional tidak tersedia (bc, printf, dc, perl, python)
Penghargaan untuk Peter Leung untuk solusi ini.
sumber
echo $((0x077E9F2DBF49D100001))
meluap batas integer 64-biit sebesar 2 ^ 64.bc
menangani ini dengan benarSatu lagi cara untuk melakukannya menggunakan shell (bash atau ksh, tidak bekerja dengan tanda hubung):
sumber
#
simbol itu? Apakah ada aplikasi atau dokumentasi lain untuk membaca lebih lanjut tentang penggunaannya?Berbagai alat tersedia untuk Anda dari dalam shell. Sputnick telah memberi Anda tinjauan yang sangat baik dari opsi Anda, berdasarkan pertanyaan awal Anda. Dia pasti pantas memilih karena dia menghabiskan banyak waktu memberikan jawaban yang benar.
Satu lagi yang tidak ada dalam daftar:
Tetapi jika semua yang ingin Anda lakukan adalah mengurangi, mengapa repot-repot mengubah input ke basis 10?
The
dc
perintah "meja calc". Ini juga akan mengambil input dari stdin, sepertibc
, tetapi alih-alih menggunakan "urutan operasi", ia menggunakan notasi susun ("reverse Polish"). Anda memberikan input yang ditambahkan ke tumpukan, lalu memberikannya operator yang mengeluarkan item dari tumpukan, dan menekan kembali hasilnya.Pada perintah di atas kita punya yang berikut ini:
16i
- Memberitahu dc untuk menerima input pada basis 16 (heksadesimal). Tidak mengubah basis output.BFCA3000
- nomor awal Anda17FF
- nomor hex acak yang saya pilih untuk mengurangi angka awal Anda-
- ambil dua angka yang kami dorong, dan kurangi yang kemudian dari yang sebelumnya, lalu dorong hasilnya kembali ke tumpukanp
- cetak item terakhir pada tumpukan. Ini tidak mengubah tumpukan, jadi ...10o
- memberitahu dc untuk mencetak outputnya di basis "10", tetapi ingat bahwa skema penomoran input kami saat ini heksadesimal, jadi "10" berarti "16".p
- cetak item terakhir pada tumpukan lagi ... kali ini dalam hex.Anda dapat membangun solusi matematika yang sangat rumit dengan dc. Ini hal yang baik untuk ada di kotak peralatan Anda untuk skrip shell.
sumber
Kesalahan seperti yang dilaporkan muncul ketika variabelnya nol (atau kosong):
Itu bisa terjadi karena nilai yang diberikan kepada bc salah. Mungkin saja bc membutuhkan nilai-nilai UPPERcase. Itu perlu
BFCA3000
, bukanbfca3000
. Itu mudah diperbaiki di bash, cukup gunakan^^
ekspansi:Itu akan mengubah skrip menjadi ini:
Tetapi tidak perlu menggunakan bc [1], karena bash dapat melakukan terjemahan dan substraksi secara langsung:
[1] Catatan: Saya mengasumsikan nilainya dapat direpresentasikan dalam matematika 64 bit, karena perbedaannya dihitung dalam bash dalam skrip asli Anda. Bash terbatas pada bilangan bulat kurang dari ((2 ** 63) -1) jika dikompilasi dalam 64 bit. Itu akan menjadi satu-satunya perbedaan dengan bc yang tidak memiliki batas seperti itu.
sumber
Di dash dan shell lainnya, Anda bisa menggunakan
untuk mengubah angka heksadesimal menjadi desimal. Ini bukan bash, atau ksh, spesifik.
sumber
printf "%d" 0xff