Little-Endian字节顺序(iOS,BLE扫描响应)

时间:2017-09-30 15:12:38

标签: ios objective-c encoding nativescript endianness

基本上,我使用nativescript作为跨平台应用程序。此应用程序与BLE设备交互。 BLE设备在广告包之后发送扫描响应,我可以在iOS端检索为NSData对象。

以下是description属性的(伪)输出:< 54fca267 0b00>。

输出表示外设的硬件地址。

硬件人员告诉我这是小端的,我知道它是一个48位的字符串。它来自外设,它的固件用C语言编写。

我已经尝试了几天将其转换为字符串(具有正确的字节顺序),以便我可以将硬件地址存储在我们的后端,但我无法提出一个优雅的解决方案。

我提出的一个解决方案是读取NSData对象的:description属性,然后手动(在javascript中)'解码'它。我只是觉得这个解决方案不适合生产环境,而是想使用原生实用程序。

我尝试过使用:

NSString.alloc().initWithDataEncoding(mac, NSUTF8StringEncoding);

..使用文档的THIS页面中的每种编码类型。我要么得到回报,要么是错误的字符。

就像我之前所说,这是用NativeScript编写的;但是,我对目标C有一个很好的理解,所以我应该能够转换用这种语言提供的任何例子。

任何输入都将不胜感激。提前谢谢!

2 个答案:

答案 0 :(得分:2)

CRD的回答是正确的,但我猜不是你要求的。你想要一个看起来像" 54的结果:fc:a2:67:0b:00" (蓝牙/ MAC地址),对吗?这是一种简单,强力的方法(你可以在循环中做到这一点,但不值得IMO)。

// Just for testing; you already have data.
uint8_t address[6] = { 0x54, 0xfc, 0xa2, 0x67, 0x0b, 0x00 };
NSData *data = [NSData dataWithBytes:address length:6];

// Check the length before proceeding (maybe return an error rather than crash :D)
assert([data length] == 6);

// Grab the bytes
const uint8_t *bytes = data.bytes;

// Format them
NSString *addressString = [NSString stringWithFormat:@"%02x:%02x:%02x:%02x:%02x:%02x",
                           bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5]];

// 3. Profit
NSLog(@"%@", addressString);

但是....

我不太确定工程师在这里是什么意思" little-endian。" 54:fc:a2不是指定的制造商代码。通常,我会假设" little-endian"意味着他们已经对16位字进行字节交换(我已经在CSR平台上遇到过),所以这应该是fc:54:67,但也没有分配。整个完全向后处理整个事情给我们00:0b:67分配给制作蓝牙相机的TopView,所以我打赌这是什么"小-endian"在这里意味着(这是有道理的,因为在线上写MAC地址的正常方式正是这种方式的倒退,并且是#34; big-endian")。

这样会将代码更改为:

NSString *addressString = [NSString stringWithFormat:@"%02x:%02x:%02x:%02x:%02x:%02x",
                           bytes[5], bytes[4], bytes[3], bytes[2], bytes[1], bytes[0]];

地址00:b0:67:a2:fc:54?

答案 1 :(得分:0)

您似乎有一个包含6个字节的NSData对象,第一个字节是最不重要的字节(little-endian)。不要尝试使用字符表示,这是二进制数据,因此处理它。

使用bytes的{​​{1}}属性获取指向第一个字节的指针,并将其保存到NSData变量,例如Byte *。现在,依次索引字节并按顺序将它们插入到64位无符号整数变量中。你可以通过在整个和/或在下一个字节中移位来实现这一点 - 从bPtr开始向下移动到bPtr[5]并每次向左移动整数。

HTH