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 elprintfcomando 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-zmayú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
kshyzsh, 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
longenteros en su sistema (intcon algunos shells). Para cualquier cosa más grande, puedes usarbcodc.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(bcsolía ser (y todavía está en algunos sistemas) una envolturadc):fuente
#?bashfunciones 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 comozshoksho usobc/dc.alias hex="printf '%x\n'"Use printf:
Para asignar el valor a una variable, utilice la sustitución de comandos:
fuente
-vopción para la impresión integrada:printf -v foo "%d" $((16#BEEF)); echo $foo-v) es innecesario aquí; Lo evitaría-vevitaría la bifurcación y la tubería (en bash, no ksh93 que no se bifurcaría aquí comoprintfestá 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