如何在iphone中将十六进制转换为double

时间:2011-08-24 14:59:12

标签: java iphone objective-c

我在Java中有这个代码:

   String pr = "4173df24c969ff63"
   long prLongBits = Long.valueOf(pr, HEX_BASE).longValue();
   prDoubleValue = Double.longBitsToDouble(prLongBits);

结果:prDoubleValue = 2.083694058837832E7

我如何在Objective C中转换它? 我试图从十六进制转换为长,然后长到双,但没有正确的结果。

BR,

Suppi

2 个答案:

答案 0 :(得分:3)

我会尝试以下内容:

// Read the hex string into a 64-bit integer
unsigned long long doubleBits;
double result;
NSScanner *scanner = [NSScanner scannerWithString:@"4173df24c969ff63"];
if ([scanner scanHexLongLong:&doubleBits]) {
    memcpy(&result, &doubleBits, sizeof(result)l
}

我没有尝试过,但基本的想法应该是正确的。您希望将十六进制字符串转换为存储在适当大小的数字数据类型中的一堆字节。一旦该位模式在内存中,我们将其复制到分配给double的内存中。

这假定用于创建十六进制字符串的字符串表示使用与运行代码的字节顺序相同的字节顺序。

答案 1 :(得分:0)

您的问题有些含糊不清,但我相信您希望将字符串解释为double的编码。这是一种方法:

#include <string.h>
#include <stdint.h>
#include <inttypes.h>
#include <stdio.h>

double interpretAsDouble(const char *string) {
    // convert the string to a 64-bit int ...
    uint64_t encoding;
    sscanf(string, "%"SCNx64, &encoding);
    // ... then interpret that 64-bit int as the encoding of a double.
    double value;
    memcpy(&value, &encoding, sizeof value);
    return value;
}

int main(int argc, char *argv[]) {
    printf("%g\n", interpretAsDouble("4173df24c969ff63"));
    return 0;
}