【问题标题】:Objective-C convert 2 byte into a floatObjective-C 将 2 个字节转换为浮点数
【发布时间】:2016-12-26 08:51:36
【问题描述】:

我有 2 个字节的温度值,例如: [0x0C, 0xDE] 我需要将其转换为浮点数,我尝试做的是:

NSData *payload <-- this contains the bytes in the "range" defined after
[payload getBytes:&bytes range:range];

float f;
int16_t bytes = OSSwapBigToHostInt16(bytes);
memcpy(&f, &bytes, 2);

NSLog(@"Value found: %f", f);

但我总是得到 0.0000 的值。

谢谢。

【问题讨论】:

  • 你的标题是 Swift,但标签和代码是 Objective-C。

标签: objective-c floating-point type-conversion byte


【解决方案1】:

我认为问题出在 memcpy 上。

// 设置测试数据。 字符测试字节[2]; 测试字节[0] = 0x0C; 测试字节[1] = 0xDE; // 创建一个演示负载。 有效载荷 = [NSData dataWithBytes:&testBytes length:2]; // 将数据复制到 int16. int16_t 字节; [payload getBytes:&bytes range:NSMakeRange(0, 2)]; // 排序字节序。 字节= OSSwapBigToHostInt16(字节); // 我们现在有一个 int16,所以将其转换为浮点数。 浮动f =(浮动)字节; NSLog(@"找到的值:%f", f); // 3294.0

我认为您不能将 int16 直接存储为浮点数。从根本上说,它们有两种不同的二进制表示。一个人不会简单地进入浮点:)。但是,你可以直接投射。

【讨论】:

  • 谢谢,现在我得到一个非零值,但这不是我期望的值。这是一个温度值,例如 [0C E1] 应该是 24.98,[0C E2] = 25
  • 好吧,如果 0x0CE2 是 25.0,每个单位都是 0.02,那么浮点转换 = ((f - 3298.0f) * 0.02f) + 25.0f;
【解决方案2】:

我回到了这个问题。此代码适用于相同的值,如下所示:

给定一个有效载荷 = 0x07c3

unsigned result = 0;
NSString *hexString = [payload hexadecimalString]; // 07:c3
hexString = [hexString stringByReplacingOccurrencesOfString:@":" withString:@""]; // 07c3

NSScanner *scanner = [NSScanner scannerWithString:hexString];
[scanner scanHexInt:&result];
value = ((float) result) / 100;

NSLog(@"Value found: %f", value); // 19.87

但例如它不适用于: 0c4e 应该返回 22.04

由于我不期望 Obj-c 和十六进制转换,任何更好的代码表示赞赏。

【讨论】:

    【解决方案3】:

    根据您自己答案中的值工作:

    - (void)testTwoBytesToFloat {
       //0x07C3   1987
       Byte lowByte = 0xC3; //Big-Endian, if Small-Endian use: 0x07;
       Byte highByte = 0x07; //Big-Endian, if Small-Endian use: 0xC3;
    
        NSInteger n = (int)highByte << 8;
        n |= (int)lowByte;
    
        XCTAssertEqual(n, 1987, @"%ld", (long)n);
    
        float temp = [NSNumber numberWithInteger:n].floatValue / 100;
        XCTAssertEqualWithAccuracy(temp, 19.87, 2, @"%.2f", temp);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-05
      • 2011-03-12
      • 1970-01-01
      • 1970-01-01
      • 2022-11-28
      相关资源
      最近更新 更多