Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
swift 3.0数据到字符串?_Swift_String - Fatal编程技术网

swift 3.0数据到字符串?

swift 3.0数据到字符串?,swift,string,Swift,String,我希望deviceToken成为字符串 但是: strisnil swift 3.0 如何将数据转换为字符串 不起作用,答案是几个月前,我试过: 并打印: 我找到了做这件事的方法。您需要将数据转换为NSData: let str = String.init(data: deviceToken, encoding: .utf8) let characterSet=characterSet(charactersIn:) 让nsdataStr=NSData.init(数据:deviceToken

我希望
deviceToken
成为字符串

但是:

str
is
nil

swift 3.0

如何将
数据
转换为
字符串

不起作用,答案是几个月前,我试过:

并打印:


我找到了做这件事的方法。您需要将
数据
转换为
NSData

let str = String.init(data: deviceToken, encoding: .utf8)
let characterSet=characterSet(charactersIn:)
让nsdataStr=NSData.init(数据:deviceToken)
let deviceStr=nsdataStr.description.trimmingCharacters(在:characterSet中)。replacingOccurrences(of:,with:)
打印(设备TR)

我是来寻找Swift 3数据到字符串问题的答案的,但从来没有得到一个好答案。经过一番胡闹,我想到了这个:

let characterSet = CharacterSet(charactersIn: "<>")
let nsdataStr = NSData.init(data: deviceToken)
let deviceStr = nsdataStr.description.trimmingCharacters(in: characterSet).replacingOccurrences(of: " ", with: "")
print(deviceStr)

根据王维佳的回答:

let str = deviceToken.map { String(format: "%02hhx", $0) }.joined()
扩展数据{
func hexString()->String{
让nsdataStr=NSData.init(数据:self)
返回nsdataStr.description.trimmingCharacters(in:CharacterSet(charactersIn:))。replacingOccurrences(of:,with:)
}
}

将其与
deviceToken.hexString()配合使用

这在Swift 3和更高版本中使用reduce更容易:

extension Data {
    func hexString() -> String {
        let nsdataStr = NSData.init(data: self)
        return nsdataStr.description.trimmingCharacters(in: CharacterSet(charactersIn: "<>")).replacingOccurrences(of: " ", with: "")
    }
}

根据下面的苹果文档,设备令牌无法解码。所以,我认为最好的办法就是别管它了

安全体系结构

设备令牌是一个不透明的NSData实例,其中包含由Apple分配给特定设备上特定应用程序的唯一标识符。只有APN可以解码和读取设备令牌的内容。每个应用程序实例在向APN注册时都会收到其唯一的设备令牌,然后必须将令牌转发给其提供商,如配置远程通知支持中所述。提供商必须在针对关联设备的每个推送通知请求中包括设备令牌;APNs使用设备令牌来确保仅将通知发送到其预期的唯一应用程序设备组合


这是我的数据分机。添加这个,您就可以调用data.ToString()


4redwings答案的Swift 4版本:

import Foundation

extension Data
{
    func toString() -> String?
    {
        return String(data: self, encoding: .utf8)
    }
}

如果您的数据是base64编码的

let testString = "This is a test string"
let somedata = testString.data(using: String.Encoding.utf8)
let backToString = String(data: somedata!, encoding: String.Encoding.utf8)

您还可以使用
let data=String(解码:myStr,as:UTF8.self)
这是有关swift 5的资源

let urlString = baseURL + currency

    if let url = URL(string: urlString){
        let session = URLSession(configuration: .default)        
        let task = session.dataTask(with: url){ (data, reponse, error) in
            if error != nil{
                print(error)
                return
            }


            let dataString = String(data: data!, encoding: .utf8)
            print(dataString)

        }

        task.resume()

    }

下次请别人试用你的代码时,请确保它没有粘贴为图像。如果有人在读取文件时遇到此问题,请检查该文件是否为UTF8编码:
file-I/path/to/file.txt
。如果不使用iconv进行转换:
iconv-f UTF-16LE-t UTF-8/path/to/file.txt>/path/to/utf8/file.txt
我已经试过你的答案了。它在其他func中工作,但在
func应用程序中不工作(\uApplication:UIApplication,DidRegisterForremotentificationswithDeviceToken deviceToken:Data)
。我不知道为什么?设备令牌不是utf8字符串,它是原始二进制所以如果它是原始二进制怎么办?String.Encoding.utf8.rawValue——对于使用DidRegisterForRemotenotificationsSwithDevice解码令牌的最新Swift用户,请参见:这是哪个字符集?让我们避免将NSData与Swift一起使用。不要使用此方法。这是不安全的。这是非常糟糕的编码-你不应该强制展开它,因为编码总是会失败,这会使应用程序崩溃。相反,返回一个可选字符串,就像苹果API一样,这有很好的理由。@WalterWhite是的,在应用程序中,我返回可选字符串。但是不要更新这个答案,谢谢你的评论。如果你把编码作为一个参数传递,如果你喜欢的话,可以将它默认为.utf8,然后你可以将它用于多种编码类型。
import Foundation

extension Data
{
    func toString() -> String?
    {
        return String(data: self, encoding: .utf8)
    }
}
let testString = "This is a test string"
let somedata = testString.data(using: String.Encoding.utf8)
let backToString = String(data: somedata!, encoding: String.Encoding.utf8)
if ( dataObj != nil ) {
    let encryptedDataText = dataObj!.base64EncodedString(options: NSData.Base64EncodingOptions())
    NSLog("Encrypted with pubkey: %@", encryptedDataText)
}
let urlString = baseURL + currency

    if let url = URL(string: urlString){
        let session = URLSession(configuration: .default)        
        let task = session.dataTask(with: url){ (data, reponse, error) in
            if error != nil{
                print(error)
                return
            }


            let dataString = String(data: data!, encoding: .utf8)
            print(dataString)

        }

        task.resume()

    }
let testString = "This is a test string"
let somedata = testString.data(using: String.Encoding.utf8)
let backToString = String(data: somedata!, encoding: String.Encoding.utf8) as String?
print("testString > \(testString)")
//testString > This is a test string
print("somedata > \(String(describing: somedata))")
//somedata > Optional(21 bytes)
print("backToString > \(String(describing: backToString))")
//backToString > Optional("This is a test string")