Bash cinsinden onaltılık bir sayıyı tersine çevirme


10

Onaltılık bir sayıyı tersine çevirmek için basit bir komut var mı?

Örneğin, onaltılık sayı verildiğinde:

030201

Çıktı şöyle olmalıdır:

010203

revKomutu kullanarak aşağıdakileri alıyorum:

102030

Güncelleme

$ bash --version | head -n1
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
$ xxd -version
xxd V1.10 27oct98 by Juergen Weigert
$ rev --version
rev from util-linux 2.20.1

2
Lütfen cevabı sorunuza eklemeyin.
kedi

@cat Cevabı ekledim çünkü benim için çalışan cevap seçilen cevabın yorumunda. Ama ben kaldırıyorum.
Iñaki Murillo

2
Yanıt kutusunun altındaki "Bu soruya cevap ver" düğmesini tıklayarak bunu yanıt olarak ekleyebilirsiniz (kendi kendine yanıtlar teşvik edilir) ve soruyu sormayın.
kedi

2
İçimdeki C programcısı "010203" bir sekizlik sayı değil, bir altıgen numarası (0x10203) olduğunu söylemek istiyor
sabitlendikten

@infixed Yanılıyorsunuz, ama 010203kullanmama rağmen onaltılık gibi davranan bir yanıt istedim0x
Iñaki Murillo

Yanıtlar:


11

Şunları yapabilirsiniz ikili dönüştürmek , bayt ters isteğe yeni satır sondaki kaldırmak rev<2,24 ve geri dönüştürmek:

$ xxd -revert -plain <<< 030201 | LC_ALL=C rev | tr -d '\n' | xxd -plain
010203

kullanma

$ bash --version | head -n1
GNU bash, version 4.3.42(1)-release (x86_64-redhat-linux-gnu)
$ xxd -version
xxd V1.10 27oct98 by Juergen Weigert
$ rev --version
rev from util-linux 2.28.2

Bu mu değil dize boş karakter içeriyorsa, çünkü işe revbu noktada çıkışı keser.


2
Bunun 0102030ayerine010203
Iñaki Murillo

@ l0b0 ve ben de, olsun0102030a
Baba

2
@ IñakiMurillo revsürümünüzde 2.20.1; bu formatı kullanxxd -revert -plain <<< '030201' | LC_ALL=C rev | tr -d '\n'| xxd -plain
Baba

2
revsürümden önce 2.24yeni bir satır hatası var. daha fazla bilgi github.com/karelzak/util-linux/commit/…
Baba

1
Hex dizesi '00' NUL baytını içeriyorsa çalışmaz.
Sylvain Leroux

10

Sisteminizde bir revkomut varsa.

hex=030201
new_hex=$(printf %s "$hex" | dd conv=swab 2> /dev/null | rev)

Bir tacveya tail -rkomutu varsa:

new_hex=$(echo "$hex" | fold -w 2 | tac | paste -sd '\0' -)

İle zsh:

setopt extendedglob
new_hex=${(j::)${(s::Oa)${hex//(#b)(?)(?)/$match[2]$match[1]}}}

( ddyaklaşımdaki gibi : karakter çiftlerini değiştirin, tek tek karakterler listesine bölün ( s::), sırayı ters çevirin ( Oa) ve join ( j::)).

POSIXly:

new_hex=$(
  awk '
    BEGIN {
      hex = ARGV[1]; l = length(hex)
      for (i = 1; i < l; i += 2)
        new_hex = substr(hex, i, 2) new_hex
      print new_hex
    }' "$hex"
)

Veya

new_hex=$(echo "$hex" |
  sed -e 'G;:1' -e 's/\(..\)\(.*\n\)/\2\1/;t1' -e 's/.//')

İle perl:

new_hex=$(perl -le 'print reverse(shift =~ /../g)' -- "$hex")

3
Ben önereceğim perl -F'(..)' -lane 'print reverse(@F)':)
Sundeep

1
@Sundeep, güzel. Birinin böyle kullanabileceğini bilmiyordum -F. ( split()Şimdi kılavuzda açıklanmıştır ).
Stéphane Chazelas

1
bildiğim kadarıyla -F, temelde bölünüyor $_.. gibi bölme -F'/"\K\|(?=")/'sayısını da belirtebilirsiniz gibi regex kullanmak dışında ... gibi -F'/:/,$_,2'... ()ayırıcı da yakalanması gerekiyorsa kullanın
Sundeep

Macun yerine kullanabilirsiniztr -d '\n'
AKHolland

10

fold+ tac+ İle tr:

$ echo 030201|fold -w2|tac|tr -d "\n"
010203
  • fold - her 2 baytı böl
  • tac - ters kedi
  • tr - yeni satırları kaldır

4
perl -nE 'say reverse /(..)/g'

Bu, her onaltılık satırı geri döndürür:

  • /(..)/g yakalanan eşleşmeleri içeren bir liste oluşturur

4

(bütünlüğü uğruna)

$ echo 030201 | grep -o .. | tac | paste -sd '' -
010203

1
Bu eserler '00' olarak boş bayt girişi ise.
Sylvain Leroux

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.