我正在尝试从父字符串中获取子字符串。 parent string是字典中可用设备的mac地址。但是,当我尝试转换它时,它给我的错误如下“[_NSInlineData substringFromIndex:]:无法识别的选择器发送到实例”。
我只是想从父字符串中删除一些字符(这里是像“< 0001ui3 234563>”这样的mac地址)并获取“ui3 234563”。
// This is my nsdictionary.
advertisementdata = { kCBAdvDataIsConnectable = 1; kCBAdvDataLocalName = "test123"; kCBAdvDataManufacturerData = <00029r21 6y051rt2>; kCBAdvDataServiceUUIDs = ( FFF0 ); kCBAdvDataTxPowerLevel = 0; }
// I want 9r216y051rt from kCBAdvDataManufacturerData;
NSString *str2;
str2=[advertisementData objectForKey:@"kCBAdvDataManufacturerData"];
NSString *str3;
str3=[str2 substringFromIndex:5];
// here I do not get the required 12 character string from str2 string.
get NSInlinedata error for all NSString method.
谢谢,
答案 0 :(得分:2)
请注意,iOS CoreBlueTooth advertisementData是二进制NSData:
文件明确指出:
CBAdvertisementDataManufacturerDataKey
A NSData object containing the manufacturer data of a peripheral.
BTW,当你有一个NSDictionary值类型NSData *时,你会通过将这个NSData转换为NSString *来获得错误*
//这是一个错误!
NSString * str2 = [advertisementData objectForKey:@&#34; kCBAdvDataManufacturerData&#34;];
要检查字典值,请尝试
NSData* advData = [advertisementData objectForKey:@"kCBAdvDataManufacturerData"];
不幸的是,由于这是二进制文件,因此您需要根据外围设备制造商的数据文档对其进行解释。没有简单的方法可以将其转换为NSString *
答案 1 :(得分:1)
听起来你有一个NSData对象,并且你正在尝试使用NSString方法来访问它。您可以使用调用initWithData: encoding:
转换NSData对象
然后将substringFromIndex调用应用于新的NSString。
答案 2 :(得分:0)
您拥有NSInlineData的要点是数据对象的十六进制表示。
第一步应该以属性列表格式获取数据对象内容的十六进制表示形式。
NSData *datakCBAdvDataManufacturerData = [advertisementData valueForKey:@"kCBAdvDataManufacturerData"];
NSString *strmanufacturerData = datakCBAdvDataManufacturerData.description;
NSString *ChkStr = [strmanufacturerData substringWithRange:NSMakeRange(10, 8)];//depends upon your requirement.
NSLog(@"%@",ChkStr);
unsigned int outVal;
NSScanner* scanner = [NSScanner scannerWithString:ChkStr];
[scanner scanHexInt:&outVal];
NSLog(@"%@",outVal);
此outVal变量将包含您需要的值。