read Hexadecimal value from string

BCS ao at pathlink.com
Tue Jul 17 15:44:20 PDT 2007


Reply to Frits,

> BCS wrote:
> 
>> Reply to David,
>> 
>>> Yep, Tango has some very kool functions. But I do want to point out
>>> that Phobos does have a radix parameter in the toString functions
>>> for converting a number to a string...sadly not the other way
>>> around.
>>> 
>> OK, brute force it is ;-b
>> |T fromString(T)(char[] str, uint r)
>> |{
>> |  T v = T.min;
>> |  goto start;
>> |  do
>> |  {
>> |    v++;
>> |  start:
>> |    if(toString(v,r) == str) return v;
>> |  }while(v != T.max);
>> |}
> :P
> 
>> (bonus points if you can find more than three things to object to.)
>> 
> Without actually compiling that, I'll list some objections:
> 1) Let's get this one out of the way first: it's brute force. I mean,
> come on!

i++

> 2) Since toString outputs uppercase characters (for digits > 9), this
> doesn't work for strings containing lowercase characters as digits.

i++

> 3) It generates a lot of heap activity for anything that doesn't
> happen
> to be close to T.min (one string per iteration). Probably especially
> problematic for applications with small signed numbers or big numbers.
> This will probably mean lots of GC cycles. 

> Arguably a symptom of (1).

i += 0

> 4) It doesn't allow a redundant '+' at the start :P.

i++

> 5) It appears from the Phobos source that toString(long value, uint
> radix) doesn't properly handle negative numbers when radix != 10.
> Though

> I guess that's a Phobos issue, not an issue in your code this cause
> the return value (if any[1]) answer given to be negative for T == long.
> After compiling (and verifying all above issues):

i+=0

> 6) Doesn't compile for T other than long or ulong due to overload
> resolution issues (those are the only two types toString(T, uint
> radix)
> is defined for).


> 7) Very bad error checking. Out-of-range or plain invalid input (and
> input triggering (2), (4) and/or (5)) results in a failed assertion at
> the end of the function due to no return statement being executed. And
> if compiled in release mode it segfaults (executing a 'hlt'
> instruction
> put there by the implicit assert(0) at the end of the function).

i += ulong.max

i>3 => bonus points <g>

> Did I miss anything?
> 

goto!!!


> [1]: Due to some of the other issues, control may reach the end of the
> function without returning anything.
> 




More information about the Digitalmars-d-learn mailing list