En Bash, ¿cómo se hace una conversión de base de decimal a otra base, especialmente hexadecimal? Parece fácil ir a la inversa:
$ echo $((16#55))
85
Con una búsqueda en la web, encontré un script que hace las matemáticas y la manipulación de caracteres para hacer la conversión, y podría usar eso como una función, pero hubiera pensado que bash ya tendría una conversión de base incorporada: ¿lo hace?
bash
shell
text-processing
hex
Dave Rove
fuente
fuente
Respuestas:
Con
bash
(o cualquier shell, siempre que elprintf
comando esté disponible (un comando POSIX estándar a menudo integrado en los shells)):Con
zsh
, también puedes hacer:Eso funciona para bases del 2 al 36 (con
0-9a-z
mayúsculas y minúsculas como dígitos).Con
ksh93
, puedes usar:Que funciona para bases de 2 a 64 (con
0-9a-zA-Z@_
los dígitos).Con
ksh
yzsh
, también hay:Aunque eso se limita a bases de hasta 36 en ksh88, zsh y pdksh y 64 en ksh93.
Tenga en cuenta que todos estos están limitados al tamaño de los
long
enteros en su sistema (int
con algunos shells). Para cualquier cosa más grande, puedes usarbc
odc
.Con bases admitidas que van desde 2 hasta algún número, POSIX requiere que sea al menos tan alto como 99. Para bases mayores que 16, los dígitos mayores que 9 se representan como números decimales con relleno de 0 separados por espacios.
O lo mismo con
dc
(bc
solía ser (y todavía está en algunos sistemas) una envolturadc
):fuente
#
?bash
funciones integradas, puede ingresar números en cualquier base, pero no generar en ninguna base que no sea 8, 10 y 16. Para otras bases, necesitaría otro shell comozsh
oksh
o usobc/dc
.alias hex="printf '%x\n'"
Use printf:
Para asignar el valor a una variable, utilice la sustitución de comandos:
fuente
-v
opción para la impresión integrada:printf -v foo "%d" $((16#BEEF)); echo $foo
-v
) es innecesario aquí; Lo evitaría-v
evitaría la bifurcación y la tubería (en bash, no ksh93 que no se bifurcaría aquí comoprintf
está incorporado). Tenga en cuenta que$((16#55))
tampoco es estándar.x=$(some_builtin)
?Utilice la sustitución de expansión aritmética incorporada presente en todos los shells compatibles con POSIX, que es bastante universal en estos días.
y
PRECAUCIÓN: Particularmente en el último ejemplo, la expansión podría causar resultados inesperados: los dígitos hexadecimales en la variable 'hexadecimal' deben formar una constante hexadecimal legal; de lo contrario, pueden aparecer mensajes de error potencialmente oscuros. por ejemplo, si 'hex' fuera '0xdead', la expansión aritmética se convertiría en 0x0xdead, lo que no se puede interpretar como una constante. Por supuesto, en ese caso la expansión aritmética $ (($ hex)) haría el truco. Se deja como ejercicio para que el lector cree la coincidencia de patrón de procesamiento de subcadena simple que eliminaría un prefijo opcional '0x'.
fuente
Puede usar la biblioteca awk Velour :
O:
fuente