Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

I want to convert a hexadecimal string to a decimal (base 10) number:

16^^ff
16^^ToExpression["ff"]

The 1st line returns the correct answer of 255, while the 2nd line gives an error. Why doesn't it work?

share|improve this question
6  
It is not correct to say (or, rather, imply) that the sigil ^^ corresponds to BaseForm, although I grant you that this is referenced in the BaseForm documentation. It is just another notation for entering numbers, like 1*^10. These particular notations are processed by the parser, are not interpreted as functions, and require that numeric literals appear both on the left and the right. It doesn't work since ToExpression["ff"] is not a numeric literal. You may use e.g. ToExpression@ToString@StringForm["16^^``", "ff"] instead. –  Oleksandr R. Feb 2 at 18:09
    
Oleksandr, What do the two grave accents mean in this case? I've seen them before to indicate accuracy, as in Accuracy[1.2``20] –  David Carraher Feb 2 at 18:21
    
@DavidCarraher It is just StringForm's syntax... The second argument to StringForm gets inserted where ever there's a double backtick. If you have more than one argument to insert, you can indicate the order with a number, like `1`. –  rm -rf Feb 2 at 18:28
    
6  
Perhaps you have good reasons to use ToExpression but FYI the usual method to interpret a hexadecimal string is with FromDigits, e.g. FromDigits["FF", 16] gives 255 –  Simon Woods Feb 2 at 20:56

1 Answer 1

up vote 1 down vote accepted

As already stated in the comments the ^^ notation is handled in parsing; observe:

HoldComplete[16^^ff] // FullForm
HoldComplete[255]

(I intend this to illustrate that this notation is "evaluated" before the main evaluator ever sees it.)

This parsing is really no different from other numerical notation in Mathematica, for example 12.345 is directly parsed as a Real number, not an expression involving Dot. Likewise 1*^6 is parsed as the Integer one million, with no relation to Times or Power.

As Simon Woods recommended, for programmatic input of hexadecimals use FromDigits:

FromDigits["ff", 16]
255
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.