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