基本上,我使用nativescript作为跨平台应用程序。此应用程序与BLE设备交互。 BLE设备在广告包之后发送扫描响应,我可以在iOS端检索为NSData对象。
以下是description属性的(伪)输出:< 54fca267 0b00>。
输出表示外设的硬件地址。
硬件人员告诉我这是小端的,我知道它是一个48位的字符串。它来自外设,它的固件用C语言编写。
我已经尝试了几天将其转换为字符串(具有正确的字节顺序),以便我可以将硬件地址存储在我们的后端,但我无法提出一个优雅的解决方案。
我提出的一个解决方案是读取NSData对象的:description属性,然后手动(在javascript中)'解码'它。我只是觉得这个解决方案不适合生产环境,而是想使用原生实用程序。
我尝试过使用:
NSString.alloc().initWithDataEncoding(mac, NSUTF8StringEncoding);
..使用文档的THIS页面中的每种编码类型。我要么得到回报,要么是错误的字符。
就像我之前所说,这是用NativeScript编写的;但是,我对目标C有一个很好的理解,所以我应该能够转换用这种语言提供的任何例子。
任何输入都将不胜感激。提前谢谢!
答案 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