iOS   发布时间:2022-03-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 如何在Swift中的NSData和NSString表示之间转换推送令牌?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经使用了以下Objective C例程多年,将NSData推送令牌转换为NSString(供Web侧推送服务使用),反之,获取令牌的已知NSString版本并重新创建NSData表示.现在,我发现需要完全相同的@L_450_1@,但在 Swift中.

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”字符串将转换为一个字节,然后将其附加到可变数据对象.

既然我在Swift编码,我需要相同的@L_450_1@,但没有发现任何类似Swift上面代码的帖子.

解决方法

从iOS提供的NSData表示转换匹配Objective C代码几乎为line:

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,请注明来意。