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
답변
당신은 할 수 바이너리로 변환 , 바이트를 역 선택적으로 줄 바꿈 후행 제거 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
. 그 시점에서 출력이 잘 리기 때문 입니다.
답변
시스템에 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")
답변
와 fold
+ tac
+ tr
:
$ echo 030201|fold -w2|tac|tr -d "\n"
010203
fold
-2 바이트마다 분할tac
-역 고양이tr
-개행 제거
답변
perl -nE 'say reverse /(..)/g'
이것은 각각의 16 진 라인을 되돌립니다 :
/(..)/g
캡처 한 일치 항목으로 목록을 작성
답변
(완전성을 위해)
$ echo 030201 | grep -o .. | tac | paste -sd '' -
010203
답변
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