Di Bash, bagaimana seseorang melakukan konversi basis dari desimal ke basis lain, terutama hex. Tampaknya mudah untuk pergi ke arah lain:
$ echo $((16#55))
85
Dengan pencarian web, saya menemukan skrip yang melakukan manipulasi matematika dan karakter untuk melakukan konversi, dan saya bisa menggunakannya sebagai fungsi, tetapi saya akan berpikir bahwa bash sudah memiliki konversi basis bawaan - melakukannya?
bash
shell
text-processing
hex
Dave Rove
sumber
sumber
Jawaban:
Dengan
bash
(atau shell apa pun, asalkanprintf
perintah tersedia (perintah POSIX standar yang sering dibuat di shell)):Dengan
zsh
, Anda juga bisa melakukan:Itu berfungsi untuk basis dari 2 hingga 36 (dengan
0-9a-z
case case-digit).Dengan
ksh93
, Anda dapat menggunakan:Yang berfungsi untuk basis dari 2 hingga 64 (dengan
0-9a-zA-Z@_
sebagai digit).Dengan
ksh
danzsh
, ada juga:Meskipun itu terbatas pada basis hingga 36 di ksh88, zsh dan pdksh dan 64 di ksh93.
Perhatikan bahwa semua itu terbatas pada ukuran
long
bilangan bulat di sistem Anda (int
dengan beberapa shell). Untuk yang lebih besar, Anda bisa menggunakanbc
ataudc
.Dengan pangkalan yang didukung mulai dari 2 hingga beberapa angka yang diperlukan oleh POSIX harus setidaknya setinggi 99. Untuk pangkalan yang lebih besar dari 16, digit lebih besar dari 9 direpresentasikan sebagai angka desimal 0-empuk yang dipisahkan oleh ruang.
Atau sama dengan
dc
(bc
dulu (dan masih ada pada beberapa sistem) pembungkusdc
):sumber
#
?bash
builtin, Anda dapat memasukkan angka di pangkalan apa pun, tetapi tidak membuat pangkalan di pangkalan apa pun selain 8, 10 dan 16. Untuk pangkalan lainnya, Anda perlu shell sepertizsh
atauksh
atau digunakanbc/dc
.alias hex="printf '%x\n'"
Gunakan printf:
Untuk menetapkan nilai pada substitusi, gunakan perintah:
sumber
-v
opsi untuk printf bawaan:printf -v foo "%d" $((16#BEEF)); echo $foo
-v
) tidak perlu di sini; Saya akan menghindarinya.-v
akan menghindari garpu dan pipa (dalam bash, bukan ksh93 yang tidak akan bercabang di sini sepertiprintf
yang dibangun). Catatan yang$((16#55))
tidak standar juga.x=$(some_builtin)
?Gunakan substitusi Ekspansi Aritmatika bawaan yang ada di semua kerangka yang sesuai dengan POSIX - yang cukup universal akhir-akhir ini.
dan
PERHATIAN: Khususnya dalam contoh terakhir ekspansi dapat menyebabkan hasil yang tidak diharapkan - digit hex dalam variabel 'hex' harus membentuk konstanta hex legal, jika tidak terjadi pesan kesalahan yang berpotensi tidak jelas. misal jika 'hex' adalah '0xdead', ekspansi aritmatika akan menjadi 0x0xdead, yang tidak dapat diartikan sebagai konstanta. Tentu saja, dalam hal ini ekspansi aritmatika $ (($ hex)) akan melakukan trik. Ini dibiarkan sebagai latihan bagi pembaca untuk membuat pencocokan pola pemrosesan substring sederhana yang akan menghapus awalan '0x' opsional.
sumber
Anda dapat menggunakan perpustakaan Velk awk :
Atau:
sumber