Linux 쉘에서 16 진수를 ASCII 문자로 변환하는 방법은 무엇입니까?
내가 문자열이 있다고 가정 해 봅시다 5a
.
이것은 ASCII 문자의 16 진 표현입니다 Z
.
16 진수 문자열을 받아 문자열이 나타내는 ASCII 문자를 출력하는 Linux 셸 명령을 알아야합니다.
그래서 만약 내가 :
echo 5a | command_im_looking_for
나는 독방 편지를 볼 것이다 Z
.
Z
echo -n 5a | perl -pe 's/([0-9a-f]{2})/chr hex $1/gie'
16 진수가 아닌 문자는 건너 뛰지 않습니다. 16 진수 만 원하는 경우 (원래 문자열의 공백 없음 등) :
echo 5a | perl -ne 's/([0-9a-f]{2})/print chr hex $1/gie'
또한, zsh
과 bash
에서 기본적으로이 기능을 지원 echo
:
echo -e '\x5a'
xxd를 사용하여이 작업을 수행했습니다.
echo -n 5a | xxd -r -p
하지만 데비안 / 우분투에서 xxd는 vim-common의 일부이므로 최소 시스템에 없을 수도 있다는 것을 깨달았습니다. 또한 perl (imho는 최소 시스템의 일부가 아님)을 피하기 위해 sed, xargs 및 printf를 다음과 같이 사용했습니다.
echo -n 5a | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf
대부분은 몇 바이트 만 변환하고 싶고 이러한 작업에는 괜찮습니다. ghostdog74에 비해이 솔루션의 장점은 임의 길이의 16 진 문자열을 자동으로 변환 할 수 있다는 것입니다. xargs는 printf가 표준 입력에서 읽지 않기 때문에 사용됩니다.
에코를 통해서만 그리고 다른 것없이 만들 수 있습니다. "-n"을 추가하는 것을 잊지 마십시오. 그렇지 않으면 자동으로 줄 바꿈이 나타납니다.
echo -n -e "\x5a"
배쉬 원 라이너
echo -n "5a" | while read -N2 code; do printf "\x$code"; done
"5a"가있는 위치에 따라 \ x를 추가하고 printf에 전달할 수 있습니다.
$ a=5a
$ a="\x${a}"
$ printf "$a"
Z
임의의 수의 바이트로 작동하는 일부 python3 한 줄.
16 진수 디코딩 (을 사용 strip
하여 stdin에 줄 바꿈이 있어도 됨) :
$ echo 666f6f0a | python3 -c "import sys, binascii; sys.stdout.buffer.write(binascii.unhexlify(input().strip()))"
foo
16 진수 인코딩 :
$ echo foo | python3 -c "import sys, binascii; print(binascii.hexlify(sys.stdin.buffer.read()).decode())"
666f6f0a
다음은 순수한 bash 스크립트입니다 (printf가 bash 내장이므로).
#warning : spaces do matter
die(){ echo "$@" >&2;exit 1;}
p=48656c6c6f0a
test $((${#p} & 1)) == 0 || die "length is odd"
p2=''; for ((i=0; i<${#p}; i+=2));do p2=$p2\\x${p:$i:2};done
printf "$p2"
bash가 이미 실행중인 경우 새 프로세스를 시작하는 다른 솔루션보다 빠릅니다.
dc는 숫자 밑으로 변환 할 수 있습니다.
$ echo 5a | (echo 16i; tr 'a-z' 'A-Z'; echo P) | dc
Z$
echo 5a | python -c "import sys; print chr(int(sys.stdin.read(),base=16))"
GNU awk 4.1
awk -niord '$0=chr("0x"RT)' RS=.. ORS=
이것에 반향하면 여분의 null 바이트가 생성됩니다.
$ echo 595a | awk -niord '$0=chr("0x"RT)' RS=.. ORS= | od -tx1c
0000000 59 5a 00
Y Z \0
대신 printf를 사용하십시오.
$ printf 595a | awk -niord '$0=chr("0x"RT)' RS=.. ORS= | od -tx1c
0000000 59 5a
Y Z
또한 GNU awk는 기본적으로 UTF-8을 생성합니다.
$ printf a1 | awk -niord '$0=chr("0x"RT)' RS=.. ORS= | od -tx1
0000000 c2 a1
ASCII 외부의 문자를 처리하고 결과 문자열을 Base64로 인코딩하려는 경우 다음을 사용하여 UTF-8을 비활성화 할 수 있습니다. -b
echo 5a | sha256sum | awk -bniord 'RT~/\w/,$0=chr("0x"RT)' RS=.. ORS=
여기 내 대답과 비슷합니다 .Linux 쉘 스크립팅 : 16 진수를 바이너리 문자열로
다음과 같은 동일한 도구로 수행 할 수 있습니다 (대신 ascii 인쇄 가능 문자 사용 5a
).
echo -n 616263 | cryptocli dd -decoders hex
다음 결과가 생성됩니다.
abcd
당으로 @Randal 주석 , 사용할 수있는 perl
, 예를 들어,
$ printf 5a5a5a5a | perl -lne 'print pack "H*", $_'
ZZZZ
다른 방법으로 :
$ printf ZZZZ | perl -lne 'print unpack "H*", $_'
5a5a5a5a
파일이있는 또 다른 예 :
$ printf 5a5a5a5a | perl -lne 'print pack "H*", $_' > file.bin
$ perl -lne 'print unpack "H*", $_' < file.bin
5a5a5a5a
'IT TIP' 카테고리의 다른 글
컬렉션 병합 (0) | 2020.12.13 |
---|---|
우분투에서 Eclipse IDE를 사용하여 Tomcat 6 서버 생성 (0) | 2020.12.13 |
Ubuntu에서 X11 / Xlib.h를 찾을 수 없음 (0) | 2020.12.13 |
datetime을 사용한 Nunit 매개 변수화 된 테스트 (0) | 2020.12.13 |
Chrome 및 Safari 브라우저 (웹킷)를 감지하는 방법 (0) | 2020.12.13 |