2010-03-01 26 views
20

Dada una lista de números decimales, ¿cómo se puede convertir cada número a su valor hexadecimal equivalente, y viceversa?Convertir decimal <-> hex

Por ejemplo:

 
(convert2hex 255 64 64); -> (FF 40 40) 
(convert2dec FF 40 40); -> (255 64 64) 

(convert2hex 255 64 64 255 64 64 128) 
(convert2dec FF 40 40 FF 40 40 80) 
+1

Es esta tarea? Lo que comenzaría haciendo es entender a un nivel alto el algoritmo para convertir la base diez en base dieciséis, * antes * tratando de implementar esto en lisp. –

+3

No es tarea. Emacs Lisp probablemente no está en el radar de ninguna escuela? :-) Me imagino que la capacidad de conversión real podría estar en algún lugar de Emacs. Si solo quiero un número convertido, puedo usar Calc, por ejemplo. –

+0

Escribí el ceceo mientras estaba en la escuela. Llamar a Calc parece excesivo, el algoritmo de conversión base no es tan malo. –

Respuesta

29

Número de Hex:

(format "%X" 255) ;; => "FF" 

También puede cero-pad el valor con:

(format "%03X" 255) ;; => "0FF" 

Cuando el 0 es el carácter que se utilizará para relleno y 3 es el número de espacios para rellenar.

cadena

Hex al número

(string-to-number "FF" 16) ;; => 255 

El 16 significa "leer como de base-16."

+0

argumento '16' se llama Radix. – ocodo

15

Si lo que desea es escribir un número hexadecimal en Emacs, no hay necesidad de llamar a string-to-number, sólo tiene que utilizar la sintaxis #x lector:

#xFF 
==> 255 

También puede utilizar #b para binario, #o para los números octales, o #36r de base 36:

#b10011001 
==> 153 
#o777 
==> 511 
#36rHELLO 
==> 29234652 

Ver section 3.1 Integer Basics en el Emacs Lisp Manual

-2

También puede establecer la variable *print-base* a 16. Usted puede este nivel mundial:

(setf *print-base* 16) (print '(10 20 30 40)) => (A 14 1E 28) 

o localmente:

(let ((*print-base* 16)) (dolist (c '(10 20 30 40)) (print c))) 
=>A 
14 
1E 
28 
NIL 
+0

¿Dónde está esto documentado? Sé que es una cosa de Common Lisp, pero no creo que esto funcione en Emacs Lisp. – ocodo

+0

En Common Lisp está documentado en p. 559 de CLtL. También puede encontrarlo en HyperSpec http://clhs.lisp.se/Body/v_pr_bas.htm. Para Emacs Lisp, sin embargo, creo que podría no implementarse. – Leo

+0

Creo que te estás perdiendo el punto. Esta es una pregunta para EmacsLisp no CL – ocodo