iPhone SDK:NSString NSNumber IEEE-754
Posted
技术标签:
【中文标题】iPhone SDK:NSString NSNumber IEEE-754【英文标题】:iPhone SDK : NSString NSNumber IEEE-754 【发布时间】:2009-12-29 12:17:41 【问题描述】:有人可以帮助我吗?我有一个带有@"12.34"
的NSString
,我想将它转换为具有相同浮点数但采用单精度32 位二进制浮点格式IEEE-754 的NSString:如@"\x41\x45\x70\xa4"
(带有十六进制字符)或@987654325 @...
我敢肯定这很容易,但是在阅读文档数小时后仍未找到解决方案...
谢谢!
【问题讨论】:
要明确:在这个网站上你可以找到一个 IEEE-754 浮点转换器从十进制浮点到 32 位和 64 位十六进制表示:babbage.cs.qc.edu/IEEE-754/Decimal.html 我需要的是一个NSString 包含传递的 NSString 中包含的浮点数的 ASCII 表示。 '@"12.34"' 到:'@"AEp¤"' 或 '@"\x41\x45\x70\xa4"' 注意:如果我执行“float fnumber = [myNSString floatValue];”当我进行调试时,我可以在内存浏览器中看到前 4 个字节是:“a4 70 45 41”。我怎样才能提取这些字节? getBytes:maxLength:usedLength:encoding:options:range:remainingRange: ?? 【参考方案1】:正如 Yuji 所提到的,将任意字节序列编码为 NSString(尽管它可以包含空字节)并不是一个好主意,因为编码转换可以(并且可能会)破坏您的字节序列。如果您想访问浮点数的原始字节,您可能需要考虑将它们存储为 NSData 对象(尽管我建议您先考虑一下想要这个的原因)。为此:
NSString *string = @"10.23";
float myFloat = [string floatValue];
NSData *myData = [[NSData alloc] initWithBytes:&myFloat length:sizeof(myFloat)];
【讨论】:
不应该是initWithBytes:&myFloat ...
吗?
谢谢迈克!我现在必须反转字节序列!有人有想法吗?【参考方案2】:
如果你想得到一个浮点数的原始字节,你可以像这样转换它:
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:
【讨论】:
将任意字节序列放入NSString
不是一个好主意,因为NSString
不会按原样保留字节序列,它可能会在内部应用编码更改,这可能会破坏字节序列而不改变文本表示。而且我不确定NSString
是否可以包含\x00
。我建议改用 NSData。以上是关于iPhone SDK:NSString NSNumber IEEE-754的主要内容,如果未能解决你的问题,请参考以下文章