Korn 쉘에서 텍스트나 문자를 16진수로 변환하는 방법

Korn 쉘에서 텍스트나 문자를 16진수로 변환하는 방법

unix korn 쉘은 텍스트나 문자를 16진수로 변환하는 기능을 제공합니까? Hex 31 32 37 33 34 35 35 36 36 37 문자 값 1273455667 여기에 표시할 코드를 작성했지만 결과를 변수에 저장하는 방법을 모르겠습니다.

str=1273455667

for (( i=0; i < ${#str}; i++ ))
do
c=${str:$i:1}
if [[ $c == ' ' ]]
then
printf "[%s] %X\n" " " \'\ \'
else
printf "[%s] %X\n" "$c" \'$c\'
fi
done

답변1

(가능성이 높으면 hexdump) 다음과 같이 할 수 있습니다.

$ echo "Hello, world!" | hexdump -v -e '/1 "[%_c]: "' -e '/1 "%02X\n"'
[H]: 48
[e]: 65
[l]: 6C
[l]: 6C
[o]: 6F
[,]: 2C
[ ]: 20
[w]: 77
[o]: 6F
[r]: 72
[l]: 6C
[d]: 64
[!]: 21
[\n]: 0A

간단한 공백으로 구분된 16진수를 변수에 덤프하려면 다음을 수행하세요.

$ v=$(printf %s 1273455667 | hexdump -v -e '/1 "%02X "')
$ echo "$v"
31 32 37 33 34 35 35 36 36 37

답변2

str=1273455667
unset hex_values
for (( i=0; i < ${#str}; i++ )); do
  c=${str:i:1}
  hex_values+=($(printf "%X" "'$c"))
done

echo "${hex_values[*]}"

에는 ksh93현재 printf '%X\n' "'$character"인코딩에서 문자를 형성하는 바이트의 16진수 값이 아니라 문자의 코드 포인트가 제공됩니다. 이런 관점에서 보면 와 비슷합니다 od -An -vtx1.

예를 들어, UTF-8 로케일에서 €(UTF-8에서 e2 82 ac로 인코딩됨)의 경우 e2 82 ac 대신 20ac(유로 기호의 유니코드 코드 포인트)가 제공됩니다.

od로케일을 C( 를 사용하여 export LC_ALL=C)로 강제 설정하면 에서와 동일한 동작을 얻을 수 있습니다.

여기서는 명령 대체( $(...))를 사용하여 명령의 출력을 검색합니다. 에서는 ksh93명령이 내장되어 있을 때 관련 파이프 생성 및 하위 쉘 분기가 없으므로 상대적으로 효율적입니다.

답변3

I occasionally do this to insert binary strings into an sqlite db
# Convert a string to hex using od
cat testfile   |
od -An -td1 | 
{
 print -n "x'"
 while read aline
 do    for i in $aline 
       do  print -n "%02x"
       done | read format
       printf "$format" $aline
 done 
 print "'"
} | read hexstr
echo "$hexstr"

답변4

awk를 사용할 수 있습니다.벨벳 도서관:

velour -n '
do print mt_basecon(str_ord(ARGV[1]), 10, 16)
while (ARGV[1] = str_slice(ARGV[1], 2))
' 1273455667

결과:

31
32
37
33
34
35
35
36
36
37

관련 정보