IEE754 和double类型互转

来源:互联网 发布:诛仙3斩龙剑测抗数据 编辑:程序博客网 时间:2024/06/01 10:04

.h文件

#import <Foundation/Foundation.h>


union FloatingPointSinglePrecisionIEEE754 {

    struct {

        unsigned int mantissa : 23;

        unsigned int exponent : 8;

        unsigned int sign : 1;

    } raw;

    float f;

} fnumber;


union FloatingPointDoublePrecisionIEEE754 {

    struct {

        uint64_t mantissa : 52;

        uint64_t exponent : 11;

        uint64_t sign : 1;

    } raw;

    double d;

} dnumber;


@interface IEEE754DoubleConvert : NSObject


+ (NSData *)double_to_data:(double)value;


+ (double)data_to_double:(NSData *)data;


+ (NSData *)string_to_data:(NSString *)destString;


+ (NSString *)data_to_string:(NSData *)destData;


+ (void)bytearrtostr:(Byte *)data length:(int)length;


double bitstring_to_double(const char* p);


@end



.m文件

@implementation IEEE754DoubleConvert


double bitstring_to_double(const char* p)

{

    unsigned long long x = 0;

    for (; *p; ++p)

    {

        x = (x << 1) + (*p - '0');

    }

    double d;

    memcpy(&d, &x, 8);

    return d;

}


+ (NSData *)double_to_data:(double)value{

    dnumber.d = value;

    uint64_t result = 0x0000000000000000;

    uint64_t mantissa = dnumber.raw.mantissa;

    uint64_t exponent = dnumber.raw.exponent;

    uint64_t sign = dnumber.raw.sign;

    result = result | (sign << 63);

    result = result | (exponent << 52);

    result = result | mantissa;

    UInt8   result8          = result & 0x00000000000000ff;

    UInt8   result7          = (result & 0x000000000000ff00) >> 8;

    UInt8   result6          = (result & 0x0000000000ff0000) >> 16;

    UInt8   result5          = (result & 0x00000000ff000000) >> 24;

    UInt8   result4          = (result & 0x000000ff00000000) >> 32;

    UInt8   result3          = (result & 0x0000ff0000000000) >> 40;

    UInt8   result2          = (result & 0x00ff000000000000) >> 48;

    UInt8   result1          = (result & 0xff00000000000000) >> 56;

    NSMutableData *data = [NSMutableData dataWithBytes:&result1 length:sizeof(result1)];

    [data appendBytes:&result2 length:sizeof(result2)];

    [data appendBytes:&result3 length:sizeof(result3)];

    [data appendBytes:&result4 length:sizeof(result4)];

    [data appendBytes:&result5 length:sizeof(result5)];

    [data appendBytes:&result6 length:sizeof(result6)];

    [data appendBytes:&result7 length:sizeof(result7)];

    [data appendBytes:&result8 length:sizeof(result8)];

    return data;

}


+ (double)data_to_double:(NSData *)data{

    long currentLocation = 0;

    UInt64 destU;

    UInt8 data1;

    [data getBytes:&data1 range:NSMakeRange(currentLocation, sizeof(UInt8))];

    destU = data1;

    currentLocation += sizeof(UInt8);

    UInt8 data2;

    [data getBytes:&data2 range:NSMakeRange(currentLocation, sizeof(UInt8))];

    destU = (destU << 8) | data2;

    currentLocation += sizeof(UInt8);

    UInt8 data3;

    [data getBytes:&data3 range:NSMakeRange(currentLocation, sizeof(UInt8))];

    destU = (destU << 8) | data3;

    currentLocation += sizeof(UInt8);

    UInt8 data4;

    [data getBytes:&data4 range:NSMakeRange(currentLocation, sizeof(UInt8))];

    destU = (destU << 8) | data4;

    currentLocation += sizeof(UInt8);

    UInt8 data5;

    [data getBytes:&data5 range:NSMakeRange(currentLocation, sizeof(UInt8))];

    destU = (destU << 8) | data5;

    currentLocation += sizeof(UInt8);

    UInt8 data6;

    [data getBytes:&data6 range:NSMakeRange(currentLocation, sizeof(UInt8))];

    destU = (destU << 8) | data6;

    currentLocation += sizeof(UInt8);

    UInt8 data7;

    [data getBytes:&data7 range:NSMakeRange(currentLocation, sizeof(UInt8))];

    destU = (destU << 8) | data7;

    currentLocation += sizeof(UInt8);

    UInt8 data8;

    [data getBytes:&data8 range:NSMakeRange(currentLocation, sizeof(UInt8))];

    destU = (destU << 8) | data8;

    UInt64 rsign = destU>>63;

    UInt64 rexponent = (destU>>52) & 0x7ff;

    UInt64 rmantissa = destU & 0x000fffffffffffff;

    dnumber.raw.mantissa = rmantissa;

    dnumber.raw.exponent = rexponent;

    dnumber.raw.sign = rsign;

    return dnumber.d;

}


+ (NSData *)string_to_data:(NSString *)destString{

    return [destString dataUsingEncoding:NSUTF8StringEncoding];

}


+ (NSString *)data_to_string:(NSData *)destData{

    return [NSString stringWithUTF8String:destData.bytes];

}


+ (void)bytearrtostr:(Byte *)data length:(int)length

{

    char char_1 = '1',char_0 = '0';

    char *chars = malloc(length*8+1);

    chars[length*8] = '\n';

    for(int i=0;i<length;i++)

    {

        Byte bb = data[i];

        for(int j=0;j<8;j++)

        {

            if(((bb>>j)&0x01) == 1)

            {

                chars[i*8+j] = char_1;

            }else{

                chars[i*8+j] = char_0;

            }

        }

        char temp = 0;

        temp =  chars[i*8+0];chars[i*8+0] = chars[i*8+7];chars[i*8+7] = temp;

        temp =  chars[i*8+1];chars[i*8+1] = chars[i*8+6];chars[i*8+6] = temp;

        temp =  chars[i*8+2];chars[i*8+2] = chars[i*8+5];chars[i*8+5] = temp;

        temp =  chars[i*8+3];chars[i*8+3] = chars[i*8+4];chars[i*8+4] = temp;

    }

    NSString *string = [NSString stringWithCString:chars encoding:NSUTF8StringEncoding];

    NSLog(@"%@",string);

    free(chars);

}

@end


0 0