저는 ASCII 숫자(16진수)를 사용하여 일부 문자를 출력하려고 했습니다 printf
. 다음과 같습니다.
#!/bin/bash
hexchars () { printf '\x%s' $@ ;}
hexchars 48 65 6c 6c 6f
Expected output:
Hello
어떤 이유로 이것은 작동하지 않습니다. 어떤 아이디어가 있나요?
편집하다:
Isaac이 제공한 답변(허용된 답변)을 바탕으로 다음 기능을 사용하게 되었습니다.
chr () { local var ; printf -v var '\\x%x' $@ ; printf "$var" ;}
서브 쉘을 피하여 속도를 향상시키기 위해 그의 답변을 약간 다시 작성했습니다.
Result:
~# chr 0x48 0x65 0x6c 0x6c 0x6f
Hello
~# chr 72 101 108 108 111
Hello
~# chr {32..126}
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}
이 함수의 역함수는 다음 chr
과 같은 함수가 될 것 같아요...
asc () { printf '%d\n' "'$1" ;}
asc A
65
chr 65
A
아니면 엄격한 16진수 변형을 원한다면...
chrx () { local var ; printf -v var '\\x%s' $@ ; printf "$var\n" ;}
ascx () { printf '%x\n' "'$1" ;}
chrx 48 65 6c 6c 6f
Hello
ascx A
41
감사합니다!
답변1
아, 물론이죠. 두 단계만 거치면 됩니다. 이는 2단계 탱고와 같습니다.
$ printf "$(printf '\\x%s' 48 65 6c 6c 6f)"; echo
Hello
또는 다른 옵션:
$ test () { printf "$(printf '\\x%s' "$@")"; echo; }
$ test 48 65 6c 6c 6f
Hello
또는 "인수 없음" 인쇄를 방지하려면 다음을 수행하십시오.
$ test () { [ "$#" -gt 0 ] && printf "$(printf '\\x%s' "$@")"; echo; }
$ test 48 65 6c 6c 6f
Hello
$
인수는 1에서 127 사이의 10진수 값으로 간주됩니다(널 인수는 계산되지만 인쇄되지는 않습니다).
답변2
\x
하나를 따라야 해단어16진수 값:
$ printf '\x48\n'
H
$ c=48
$ printf '\x%s\n' "$c"
bash: printf: missing hex digit for \x
\x48
printf
아마도 이는 결과 문자열을 형식으로 사용하기 전에 형식 문자열의 모든 16진수 리터럴이 별도의 단계로 확장되기 때문일 것입니다 .
당신은 무엇을 할 수 있나요:
unhexlify() {
for character
do
format="\x${character}"
printf "$format"
done
printf '\n'
}
시험:
$ unhexlify 48 65 6c 6c 6f
Hello
답변3
사용진주그것이 pack
하는 일은 두 개의 16진수 숫자를 묶고 ASCII 표현을 인쇄하는 것입니다.
charx() {
perl -le 'print pack "(H2)*", @ARGV' -- "$@"
}
우리는 데스크탑 계산기를 사용합니다직류16진수를 입력하고 다음 명령을 사용하여 ASCII 문자로 인쇄합니다.ㅏ주문하다.
charx() {
dc <<eof
16i
$(echo "$@" | tr a-f A-F)
[SAz0<a]sa
[LAanln1-dsn0<b]sb
[zsnlaxlbxAan]sc
z0<c
eof
}
다음과 같이 사용됩니다:
charx 48 65 6c 6c 6f
결과
Hello