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的主要内容,如果未能解决你的问题,请参考以下文章

Iphone SDK: pathFoResource:Nsstring 问题 -> 播放 MP3 文件

NSString 到 NSNumber

闹钟 iphone sdk

iPhone SDK 是不是限制 udp 广播?

如何在 iphone sdk 中合并音频和视频

如何从 iphone sdk 中的 ISOCountryCode 获取 ISOCurrencyCode?