ย้อนกลับตัวเลขฐานสิบหกในทุบตี


10

มีคำสั่งง่าย ๆ ในการกลับเลขฐานสิบหกหรือไม่?

ตัวอย่างเช่นกำหนดตัวเลขฐานสิบหก:

030201

ผลลัพธ์ควรเป็น:

010203

ใช้revคำสั่งฉันได้รับต่อไปนี้:

102030

ปรับปรุง

$ 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
โปรดอย่าเพิ่มคำตอบสำหรับคำถามของคุณ
แมว

@cat ฉันเพิ่มคำตอบเนื่องจากคำตอบที่เหมาะกับฉันอยู่ที่ความคิดเห็นของคำตอบที่เลือก แต่ฉันก็เอามันออก
Iñaki Murillo

2
คุณสามารถเพิ่มเป็นคำตอบได้โดยคลิกปุ่ม "ตอบคำถามนี้" ด้านล่างช่องคำตอบ (แนะนำให้ตอบด้วยตนเอง) และคุณควรอย่าใส่ไว้ในคำถาม
แมว

2
โปรแกรมเมอร์ C ในตัวผมอยากจะพูดว่า "010203" เป็นเลขฐานแปดไม่ได้เป็นจำนวนฐานสิบหก (0x10203)
infixed

@ ติดตั้งแล้วคุณไม่ผิด แต่ฉันต้องการคำตอบที่ถือว่า010203เป็นเลขฐานสิบหกแม้ว่าฉันจะไม่ได้ใช้ 0x
Iñaki Murillo

คำตอบ:


11

คุณสามารถแปลงเป็นไบนารี , ย้อนกลับไบต์เลือกลบต่อท้ายบรรทัดใหม่rev<2.24และแปลงกลับ:

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

การใช้

$ 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

สิ่งนี้ไม่ทำงานหากสตริงมีไบต์ NUL เนื่องจากrevจะตัดทอนผลลัพธ์ที่จุดนั้น


2
ฉันจะได้รับ0102030aแทน010203
Iñaki Murillo

@ l0b0 และฉันด้วยรับ0102030a
Baba

2
@ IñakiMurilloของคุณในrevรุ่น2.20.1; ใช้รูปแบบนี้xxd -revert -plain <<< '030201' | LC_ALL=C rev | tr -d '\n'| xxd -plain
บาบา

2
revก่อนเวอร์ชัน2.24มีบั๊กบรรทัดใหม่ ข้อมูลเพิ่มเติมgithub.com/karelzak/util-linux/commit/…
Baba

1
มันไม่ทำงานหากสตริงฐานสิบหกมีไบต์ '00' NUL
Sylvain Leroux

10

หากระบบของคุณมีrevคำสั่ง

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

หากมีtacหรือtail -rคำสั่ง:

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

ด้วยzsh:

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

(เหมือนในddวิธีการ: สลับคู่ของตัวละครแบ่งออกเป็นรายการของตัวละครแต่ละตัว ( s::) กลับคำสั่งซื้อ ( Oa) และเข้าร่วม ( 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"
)

หรือ

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

ด้วยperl:

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

3
ฉันกำลังจะแนะนำperl -F'(..)' -lane 'print reverse(@F)':)
Sundeep

1
@ ซันเดย์ดี ฉันไม่รู้ว่าใช้-Fอย่างนั้นได้ (ฉันสามารถดูได้อธิบายไว้ในsplit()คู่มือตอนนี้)
Stéphane Chazelas

1
เท่าที่ฉันรู้-Fก็คือการแยกโดยทั่วไป$_.. นอกเหนือจากการใช้ regex อย่างที่-F'/"\K\|(?=")/'ใครสามารถระบุจำนวนของการแยกเช่นกัน ... เช่น-F'/:/,$_,2'... ใช้()ถ้าตัวแยกต้องถูกจับเช่นกัน
Sundeep

แทนที่จะใช้แปะคุณสามารถใช้tr -d '\n'
AKHolland

10

ด้วยfold+ tac+ tr:

$ echo 030201|fold -w2|tac|tr -d "\n"
010203
  • fold - แยกทุก 2 ไบต์
  • tac - ย้อนกลับแมว
  • tr - ลบบรรทัดใหม่

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

สิ่งนี้จะเปลี่ยนกลับไปเป็นเลขฐานสิบหกแต่ละบรรทัด:

  • /(..)/g สร้างรายการด้วยการจับคู่ที่ตรงกัน


0

ตามคำตอบของ Ipor Sircer https://unix.stackexchange.com/a/321867/337458ฉันจะแนะนำสิ่งนี้ใน~/.bashrcคำสั่งของคุณเพื่อให้มีคำสั่งที่ดีที่คุณสามารถโทรหา:

function hex_inverse() {
    echo ${1} | fold -w2 | tac | tr -d "\n" ; echo "" 
}

$> hex_inverse 030201

010203
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.