将int转换为十六进制,最后执行NSData

时间:2014-04-29 09:55:23

标签: ios bluetooth-lowenergy core-bluetooth

我在找到写蓝牙设备特性的正确方法时遇到了问题。这个密码有3个字节,在写完所有特征之后,我必须将这个密码写入其最后一个字段(名为FFFF),以便保存。

密码为0000150x00000f十六进制,我正在使用此代码:

if([characteristic.UUID isEqual: [CBUUID UUIDWithString: @"FFFF"]]) {
  bt = 15;
  NSString *hex = [NSString stringWithFormat:@"0x%06x", (unsigned int) bt];
  NSLog(@"Hex value: %@", hex);
  [peripheral writeValue:[NSData dataWithBytes:&hex length:3]forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
}

问题是虽然从int到hex的转换似乎是正确完成的,但在尝试将其写为NSData时,我收到错误"Encryption is insufficient"。制造商说这意味着“错误的密码”(他们没有任何关于如何编写它的iOS示例代码)。

1 个答案:

答案 0 :(得分:5)

使用字节缓冲区更简单,如下所示。这假设密码是小端(首先是最低有效字节)。如果它期望大端,你只需要反转字节顺序。

if([characteristic.UUID isEqual: [CBUUID UUIDWithString: @"FFFF"]]) {
  Byte byteArray[] = { 0x0F, 0x00, 0x00 }; 
  [peripheral writeValue:[[NSData alloc] initWithBytes: byteArray length: 3]forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
}

问题中的代码不起作用,因为它会将十六进制字符串转换为字节,这根本不是您想要的。您最终会为字符串中的八个字符中的每个字符获取一个字节," 0x00000F"。你想要三个字节。