2009-12-29 2 views
0

Может кто-нибудь мне помочь? У меня есть NSString с @"12.34", и я хочу преобразовать его в NSString с одним и тем же числом с плавающей запятой, но в бинарном формате с плавающей запятой с одиночной точностью 32 бита IEEE-754: @"\x41\x45\x70\xa4" (с шестнадцатеричными символами) или @"AEp¤" ... Я уверен, что это что-то легкое, но после многих часов чтения документа без нахождения решения ...iPhone SDK: NSString NSNumber IEEE-754

Спасибо!

+0

Чтобы было ясно: На этом сайте вы можете найти IEEE-754 с плавающей точкой преобразователь десятичных чисел с плавающей точкой в ​​32-разрядных и 64-разрядных шестнадцатеричных представлений: HTTP: // babbage.cs.qc.edu/IEEE-754/Decimal.html Что мне нужно, это NSString, который содержит ASCII-представление поплавка, содержащегося в переданной NSString. '@ "12.34"' to: '@ "AEp¤"' или '@ "\ x41 \ x45 \ x70 \ xa4"' – LeBelge

+0

ПРИМЕЧАНИЕ: если я делаю «float fnumber = [myNSString floatValue];» когда я делаю отладки, я вижу в браузере памяти, что 4 первых байта: «a4 70 45 41». Как я могу извлечь эти байты? getBytes: maxLength: usedLength: encoding: options: range: yetRange: ?? – LeBelge

ответ

1

Как уже упоминалось Юджи, это не очень хорошая идея, чтобы кодировать произвольную последовательность байт в NSString (хотя он может содержать нулевые байты), а преобразования кодирования могут (и, вероятно, WILL) уничтожить последовательность байтов. Если вы хотите получить доступ к необработанным байтам с плавающей точкой, вы можете захотеть сохранить их как объект NSData (хотя я предлагаю вам подумать о причинах, почему это требуется в первую очередь). Для этого:

NSString *string = @"10.23"; 
float myFloat = [string floatValue]; 
NSData *myData = [[NSData alloc] initWithBytes:&myFloat length:sizeof(myFloat)]; 
+0

Не должно быть 'initWithBytes: & myFloat ...'? –

+0

Спасибо, Майк! Теперь я должен инвертировать последовательность байтов! У кого-то есть идея? – LeBelge

+0

Сделали это с помощью цикла «NSMutableData» и «for». – LeBelge

0

Если вы хотите получить исходные байты поплавка, вы могли бы бросить его, вот так:

NSString *str = @"12.34"; 
float flt = [str floatValue]; 
unsigned char *bytes = (unsigned char *)&flt; 
printf("Bytes: %x %x %x %x\n", bytes[0], bytes[1], bytes[2], bytes[3]); 

Однако порядок, в котором эти байты хранятся в массиве зависит от машины. (См. http://en.wikipedia.org/wiki/Endianness). Например, на моем Intel iMac он печатает: «Bytes: a4 70 45 41».

Чтобы создать новый NSString из массива байтов вы можете использовать initWithBytes:length:encoding:

+1

Не рекомендуется помещать произвольную последовательность байтов в 'NSString', потому что' NSString' не сохраняет байтовую последовательность как есть, она может применять внутреннее изменение кодировок, что может привести к потере последовательности байтов без изменения текстовое представление. И я не уверен, что 'NSString' может содержать' \ x00'. Я бы рекомендовал вместо этого использовать NSData. – Yuji

 Смежные вопросы

  • Нет связанных вопросов^_^