大佬教程收集整理的这篇文章主要介绍了ios – 如何在Swift中的NSData和NSString表示之间转换推送令牌?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
dataToHex Objective C代码主要使用printf格式:
- (NSString *)dataToHex:(NSData *)data { NSMutableString *str = [NSMutableString StringWithCapacity:100]; const unsigned char *p = [data bytes]; NSUInteger len = [data length]; for(int i=0; i<len; ++i) { [str appendFormat:@"%02.2X",p[i]]; } return str; }@H_675_10@逆向翻译是:
- (NSData *)hexToData:(NSString *)str { const char *ptr = [str cStringUsingEncoding:NSASCIIStringEncoding]; NSUInteger len = [str length]/2; NSMutableData *data = [NSMutableData dataWithCapacity:len]; while(len--) { char num[5] = (char[]){ '0','x',0 }; num[2] = *ptr++; num[3] = *ptr++; uint8_t n = (uint8_t)strtol(num,NULL,0); [data appendBytes:&n length:1]; } return data; }@H_675_10@通过“巧妙地”覆盖ASCII数组中的两个字节,“0xXX”字符串将转换为一个字节,然后将其附加到可变数据对象.
func dataToHex(data: NSData) -> String { var str: String = String() let p = UnsafePointer<UInt8>(data.bytes) let len = data.length for var i=0; i<len; ++i { str += String(format: "%02.2X",p[i]) } return str }@H_675_10@但是,给定一个NSString对象,转换回NSData对象有点困难.如果您在模拟器中进行测试,从真实设备获得字符串标记,并且需要它来注册服务,则可能需要执行此操作.
我采用的第一种方法试图复制我之前使用的代码,通过创建一个包含字符对的字符串,并调用strtol:
func hexToData0(str: NSString) -> NSData { let len = str.length/2 var data = NSMutableData(capacity:len)! var num: [Int8] = [ 0,0 ] let ptr = str.cStringUsingEncoding(NSUTF8StringEncoding) for var i=0; i<len; ++i { num[0] = ptr[i*2+0] num[1] = ptr[i*2+1] var n = UInt8 ( strtol(&num,nil,16) ) data.appendBytes(&n,length:1) } return data; }@H_675_10@我只觉得strtol有点像黑客,所以我使用NSScAnner做了同样的代码大小相同,但效率最低:
func hexToData1(str: NSString) -> NSData { var data = NSMutableData(capacity: str.length/2)! for var i = 0; i<str.length; i+=2 { let r = NSRange(LOCATIOn: i,length: 2) let s = str.subStringWithRange(r) let sc = NSScAnner(String: s) var val: UInt32 = 0 let ret = sc.scanHexInt(&val) if ret { var b = UInt8(val) data.appendBytes(&b,length: 1) } else { assert(false,"Yikes!") } } return data }@H_675_10@然后,我想到我可以在Swift中完成所有工作,不需要达尔文或基金会,而代价是更多的代码:
// Swift 4 func hexToData(str: String) -> Data { let len = str.count/2 var data = Data(capacity:len) let ptr = str.cString(using: String.Encoding.utf8)! for i in 0..<len { var num: UInt8 = 0 var multi: UInt8 = 16; for j in 0..<2 { let c: UInt8 = UInt8(ptr[i*2+j]) var offset: UInt8 = 0 switch c { case 48...57: // '0'-'9' offset = 48 case 65...70: // 'A'-'F' offset = 65 - 10 // 10 since 'A' is 10,not 0 case 97...102: // 'a'-'f' offset = 97 - 10 // 10 since 'a' is 10,not 0 default: assert(false) } num += (c - offset)*multi multi = 1 } data.append(num) } return data; }@H_675_10@我在我的代码中使用了最终的hexToData.
以上是大佬教程为你收集整理的ios – 如何在Swift中的NSData和NSString表示之间转换推送令牌?全部内容,希望文章能够帮你解决ios – 如何在Swift中的NSData和NSString表示之间转换推送令牌?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。