Convertir décimal hexadécimal

Étant donné une liste de nombres décimaux, comment chaque nombre peut-il être converti en sa valeur hexadécimale équivalente, et vice versa?

Par exemple:

(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)
21
demandé sur haxney 2010-03-01 22:51:48

4 réponses

Nombre à hexadécimal:

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

Vous pouvez également zero-pad la valeur avec:

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

, la 0 est le caractère à utiliser pour le remplissage et 3 est le nombre d'espaces à la map.

Chaîne hexadécimale au nombre

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

Le 16 signifie " lire comme base-16."

30
répondu haxney 2010-03-02 00:15:58

Si vous voulez simplement taper un nombre hexadécimal dans Emacs, il n'est pas nécessaire d'appeler string-to-number, utilisez simplement la syntaxe du lecteur #x:

#xFF
==> 255

Vous pouvez aussi utiliser #b pour les binaires, #o pour les nombres octaux, ou #36r pour base 36:

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

Voir section 3.1 notions de base sur les entiers dans le manuel Emacs Lisp

15
répondu Gareth Rees 2010-03-03 14:04:44

J'étais intéressé à convertir des caractères octaux en caractères hexadécimaux dans un fichier source.

Je voulais interroger la recherche et remplacer sur le texte suivant:

'\0'   -> "\\0", // Null
'\7'   -> "\\a", // Bell (^G)
'\b'   -> "\\b", // Backspace (^H)
'\13'  -> "\\v", // Vertical tab (^K)
'\33'  -> "\\e", // Escape (^[)

Ici était l'expression régulière de rechercher et de remplacer

C-M-%

'\\\([0-9]+\)'

RET

'\,(format "\\0x%04X" (string-to-number \1 8))'

RET

Le résultat est:

'\0x0000' -> "\\0", // Null
'\0x0007' -> "\\a", // Bell (^G)
'\b'      -> "\\b", // Backspace (^H)
'\0x000B' -> "\\v", // Vertical tab (^K)
'\0x001B' -> "\\e", // Escape (^[)
1
répondu ashawley 2018-04-11 19:11:22

, Vous pouvez également définir la variable *print-base* 16. Vous pouvez cela globalement:

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

, Ou localement:

 (let ((*print-base* 16)) (dolist (c '(10 20 30 40)) (print c)))
=>A 
14 
1E 
28 
NIL
-3
répondu Leo 2015-03-03 18:31:32