NSScaner - не получается получить HexFloatValue?

Я пытаюсь использовать следующий код:

float fValue = 0;
NSScanner *scanner = [NSScanner scannerWithString:@"0x41CC8937"];
[scanner scanHexFloat:&fValue];

Hex 0x41CC8937 = с плавающей запятой 25.567.

Но я получаю fValue = 0x4E839912 (float 1103923456.000000), почему?


person TESTer    schedule 17.05.2013    source источник
comment
stackoverflow.com/questions/594797/how-to-use-nsscanner   -  person    schedule 17.05.2013
comment
в вашем случае NSScanner работает только со строками   -  person Volodymyr B.    schedule 17.05.2013
comment
В документации написано - вызовите этот метод с NULL как результат, чтобы просто просканировать шестнадцатеричное представление с плавающей запятой. Как понять?   -  person TESTer    schedule 17.05.2013


Ответы (1)


scanHexFloat ожидает "шестнадцатеричной константы с плавающей запятой", вы можете узнать больше об этом здесь: http://www.exploringbinary.com/hexadecimal-floating-point-constants/.

Что у вас есть двоичное представление 32-битного значения с плавающей запятой. Вы можете прочитать это с помощью scanHexInt и использовать объединение для интерпретации числа как float:

union {
    float fValue;
    unsigned int iValue;
} u;
NSScanner *scanner = [NSScanner scannerWithString:@"0x41CC8937"];
[scanner scanHexInt:&u.iValue];
NSLog(@"%f", u.fValue);

Выход: 25.566999

person Martin R    schedule 17.05.2013
comment
Спасибо! Вызовите этот метод с NULL в качестве результата, чтобы просто просканировать шестнадцатеричное представление с плавающей запятой. Как это работает? - person TESTer; 17.05.2013
comment
@TESTer: если вас не интересует значение и вы просто хотите пропустить шестнадцатеричное число во вводе, вы можете вызвать [scanner scanHexInt:NULL]. - person Martin R; 17.05.2013