bash에서 16 진수를 뒤집으십시오


10

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

2
질문에 대한 답변을 추가하지 마십시오.
cat

@ cat 저에게 도움이 된 답변이 선택한 답변의 의견에 있기 때문에 답변을 추가했습니다. 하지만 제거해도 괜찮습니다.
Iñaki Murillo

2
답변 상자 아래의 "이 질문에 답변하기"버튼을 클릭하여 답변으로 추가 할 수 있으며 (자체 답변을 권장합니다) 질문에 넣지 마십시오.
cat

2
나에있는 C 프로그래머는 "010203"는 8 진수가 아닌 16 진수 (0x10203)라고하고 싶어
infixed

@infixed 당신은 틀리지 않습니다, 그러나 나는 010203사용하지 않더라도 16 진수로 취급되는 답변을 원했습니다0x
Iñaki Murillo

답변:


10

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

@ l0b0 그리고 나도, get0102030a
Baba

2
귀하의 rev버전 에서 @ IñakiMurillo 2.20.1; 이 formate를 사용하십시오xxd -revert -plain <<< '030201' | LC_ALL=C rev | tr -d '\n'| xxd -plain
Baba

2
rev버전 전에 2.24새로운 라인 버그가 있습니다. 자세한 정보 github.com/karelzak/util-linux/commit/…
Baba

1
16 진 문자열에 '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
@Sundeep, 좋아. 나는 그런 식으로 사용할 -F수 있다는 것을 몰랐습니다 . ( split()지금 설명서에 설명되어 있습니다).
Stéphane Chazelas

1
내가 아는 한, -F기본적으로 분할됩니다 $_.... 정규 표현식을 사용하는 것과는 별도로 분할 -F'/"\K\|(?=")/'수를 지정할 수있는 것처럼 -F'/:/,$_,2'... ()분리
기호도

페이스트를 사용하는 대신 다음을 사용할 수 있습니다.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'

이것은 각각의 16 진 라인을 되돌립니다 :

  • /(..)/g 캡처 한 일치 항목으로 목록을 작성

4

(완전성을 위해)

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

1
작동하는 '00'NUL 바이트는 입력에있는 경우.
Sylvain Leroux

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.