将uint8_t和uint16_t转换为NSMutableData

4
我对编程比较陌生,但我正在尝试使用CoreBluetooth for iOS开发一个蓝牙健身设备。我购买了不同硬件制造商的多个设备进行测试,并且其中一个发送值到设备的指令如下:
我想要能够将一个值(健身目标)写入蓝牙健身设备中。我知道如何使用蓝牙进行读写。
我只是不知道如何将我想要的值转换为uint8_t和uint16_t,然后组合成一个8字节的NSMutableData。
有人能告诉我如何做吗?

NS(Mutable)Data只是字节数组的封装形式。您需要将值转换为字节序列。(您知道如何在C中使用移位和掩码操作吗?) - Hot Licks
1
你应该先学习C语言,再学习Objective-C,因为Objective-C不适合初学者。 - Hot Licks
1个回答

8

首先需要关注的是字节序。对于 uint8_t 来说并不重要,但对于任何更大的类型就很重要了。可以有大端序或小端序。请查看设备文档。

从您的值开始:

uint8_t days = 12;
uint16_t walked = 225;
uint16_t ran = 110
uint16_t steps = 750;
uint8_t users = 2;

NSMutableData *data = [NSMutableData data];
[data appendBytes:&days length:1];
uint16_t network = CFSwapInt16HostToBig(walked);
[data appendBytes:&network length:2];
network = CFSwapInt16HostToBig(ran);
[data appendBytes:&network length:2];
network = CFSwapInt16HostToBig(steps);
[data appendBytes:&network length:2];
[data appendBytes:&users length:1];

上述假设您需要以大端格式获取数据。如果需要使用小端,则将CFSwapInt16HostToBig更改为CFSwapInt16HostToLittle


非常感谢rmaddy!这确实有所帮助。它正在传输到设备,除了走路、跑步和步数之外都不准确。用户和日期是正确的(uint8_t值)。它显示的走路值为:025,跑步为:210,步数为:150。我猜这些顺序只是错了。我尝试了HostToLittle,但没有成功。还有其他建议吗?再次感谢 :) - Teddy13
您在 HostToLittle 中看到了哪些值? - rmaddy
对于HostToLittle,walked = 000,ran = 666,steps = 130。谢谢! - Teddy13
两者都没有意义。如果只是使用了错误的字节顺序,那么错误的顺序可能会给出远离正确值的数字,但两组数字相似。您确定代码中没有错别字,并且确定这是if字节的正确顺序,而且确实是8个字节吗?单位呢?距离可能是英尺/米的问题。但这并不能解释步数。我认为英制/公制计数没有问题。 :) - rmaddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接