Bash의 역방향 16진수

Bash의 역방향 16진수

16진수를 바꾸는 간단한 명령이 있습니까?

예를 들어, 16진수 숫자가 주어지면 다음과 같습니다.

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

답변1

fold++ 로 :tactr

$ echo 030201|fold -w2|tac|tr -d "\n"
010203
  • fold- 2바이트마다 분할
  • tac- 역방향 고양이
  • tr- 개행 문자 제거

답변2

시스템에 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[])).

또는:

printf -v new_hex '%2$s%1$s' ${(s[]Oa)hex}

POSIX적으로:

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

당신은 할 수바이너리로 변환하세요,역방향 바이트, 선택적으로후행 줄 바꿈 제거 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

이것은 실제로아니요문자열에 00(NUL 바이트) 가 포함되어 있으면 rev해당 지점의 출력이 잘리거나 0a(개행)이 포함된 rev경우 유효합니다.철사전체 출력보다는

답변4

(완전함을 위해)

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

관련 정보