En la tabla ASCII existe el carácter 'J' que tiene puntos de código en diferentes sistemas numéricos:
Oct Dec Hex Char
112 74 4A J
Es posible imprimir este carácter mediante un punto de código octal imprimiendo
printf '\112'
o echo $'\112'
. ¿Cómo imprimo el mismo carácter mediante presentaciones de puntos de código decimal y hexadecimal?
Respuesta1
Maleficio:
printf '\x4a'
Dic:
printf "\\$(printf %o 74)"
Alternativa para hexadecimal :-)
xxd -r <<<'0 4a'
Respuesta2
En general, el shell podría comprender números hexadecimales, oct y decimales en variables, siempre que se hayan definido como integers
:
$ declare -i v1 v2 v3 v4 v5 v6 v7
$ v1=0112
$ v2=74
$ v3=0x4a
$ v4=8#112
$ v5=10#74
$ v6=16#4a
$ v7=18#gg
echo "$v1 $v2 $v3 $v4 $v5 $v6 $v7"
74 74 74 74 74 74 304
O son el resultado de una "Expansión Aritmética":
$ : $(( v1=0112, v2=74, v3=0x4a, v4=8#112, v5=10#74, v6=16#4a, v7=18#gg ))
$ echo "$v1 $v2 $v3 $v4 $v5 $v6 $v7"
74 74 74 74 74 74 304
Entonces, solo necesitas una forma de imprimir el carácter que pertenece a un valor de variable.
Pero aquí hay dos formas posibles:
$ var=$((0x65))
$ printf '%b\n' "\\$(printf '0%o' "$var")"
e
$ declare -i var
$ var=0x65; printf '%b\n' "\U$(printf '%08x' "$var")"
e
Se necesitan dos printf, uno para transformar el valor en una cadena hexadecimal y el segundo para imprimir el carácter.
El segundo imprimirá cualquier punto UNICODE (si su consola está configurada correctamente).
Por ejemplo:
$ var=0x2603; printf '%b\n' "\U$(printf '%08x' "$var")"
☃
Un hombre de nieve.
El personaje que tiene una representación utf-8 tal f0 9f 90 ae
cual 0x1F42E
. buscar cow face site:fileformat.info
hastaConsíguelo:
$ var=0x1F42F; printf '%b\n' "\U$(printf '%08x' "$var")"
Respuesta3
Decimal:
chr() {
local c
for c
do
printf "\\$((c/64*100+c%64/8*10+c%8))"
done
}
chr 74
Maleficio:
chr $((16#4a))
La función puede hacer secuencias:
$ chr 74 75 76; echo
JKL
$
Respuesta4
Si tiene una lista de números para convertir y desea evitar una llamada de función y la creación de una subcapa para cada carácter, puede definir el conjunto ascii de antemano:
ascii=$(for x in {0..9} {A..F}; do for y in {0..9} {A..F}; do echo -ne "\x$x$y"; done; done)
Tenga en cuenta que se excluye el carácter nulo, por lo que cada carácter se compensa en 1.
Luego use algo como esto (se supone 1 número por línea):
while read c; do out+="${ascii:$c-1:1}"; done <<< "$in"
echo "$out"