일부 ASCII 숫자가 주어진 문자를 출력하려면 printf를 사용하십시오.

일부 ASCII 숫자가 주어진 문자를 출력하려면 printf를 사용하십시오.

저는 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

관련 정보