【问题标题】:Convert binary two's complement data into integer in objective-c在objective-c中将二进制二进制补码数据转换为整数
【发布时间】:2014-02-21 10:30:48
【问题描述】:

我有一些来自加速度计的二进制数据(二进制补码),我需要将其转换为整数。是否有一个标准库函数可以做到这一点,还是我需要编写自己的代码?

例如:我从加速度计接收到一个 NSData 对象,当转换为十六进制时,它看起来像这样:

C0088001803F

这是 3 个 2 字节数据块的串联:

x = C008
y = 8001
z = 803F

只关注 x 轴:

hex = C008
decimal = 49160
binary = 1100000000001000
twos complement = -16376

有没有标准函数可以将二进制补码的 C008 直接转换为 -16376?

谢谢。

【问题讨论】:

  • 使用 NSData 将二进制数据转换成任何其他...
  • 你能显示二进制数据的类型吗?它是 NSData 的一个实例吗?它是一个 int[]?是只有一个整数还是不止一个?
  • 所以你把它作为一个字符串还是 2s 完成?请简单地转储您的 NSData 实例并将其添加到 Q 中。没有假设就很难回答您的问题。
  • @AminNegm-Awad 我没有 NSData 可以转储给您,但是当我将其转换为十六进制时,它看起来像上面那样。我不确定为什么 NSData 的转储看起来很重要 - 问题是我如何将 C008 的十六进制值转换为 -16376。还是我错过了什么?
  • 1.您可以使用 -description 转储它。 2. 是的,这很重要:--->你能显示二进制数据的类型吗?所以你得到它是一个字符串还是2s comp lent?不是二进制数据。不是,它可以是 0xC008 "C008"。有什么问题要告诉我们?

标签: ios objective-c binary accelerometer twos-complement


【解决方案1】:

类似:

const int8_t* bytes = (const int8_t*) [nsDataObject bytes];

int32_t x = (bytes[0] << 8) + (0x0FF & bytes[1]);
x = x << 16;
x = x >> 16;

int32_t y = (bytes[2] << 8) + (0x0FF & bytes[3]);
y = y << 16;
y = y >> 16;

int32_t z = (bytes[4] << 8) + (0x0FF & bytes[5]);
z = z << 16;
z = z >> 16;

这假设值确实是问题中建议的“大端”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 2021-05-16
    • 2013-09-28
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    相关资源
    最近更新 更多