¿Cómo imprimo un carácter ASCII mediante diferentes puntos de código en Bash?

¿Cómo imprimo un carácter ASCII mediante diferentes puntos de código en Bash?

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 aecual 0x1F42E. buscar cow face site:fileformat.infohastaConsí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"

información relacionada