简体   繁体   English

Swift问题中的NSData到String

[英]NSData to String in Swift Issues

I'm having issues converting my NSData to NSString in swift. 我在swift中将NSData转换为NSString时遇到问题。 I'm using what I think is the correct command and format: NSString(data: <DATA>, encoding: <ENCODING>) however whatever I do i keep ending up with a nil value. 我正在使用我认为正确的命令和格式: NSString(data: <DATA>, encoding: <ENCODING>)然而无论我做什么,我都会以nil值结束。 I am running the latest Xcode beta so I'm not sure if that is related but I'm hoping its a simple easy error that I've run into. 我正在运行最新的Xcode测试版,所以我不确定这是否相关,但我希望这是一个简单的错误,我遇到了。

I've attached playground code as well as a screen capture. 我附上了游乐场代码和屏幕截图。

Playground Code for Xcode 6.3 Beta 2 Build (6D532l) Xcode 6.3 Beta 2 Build(6D532l)游乐场代码

import Foundation

//: # NSData to String Conversion Playground
//: ### Step 1
//: The first step is to take an array of bytes and conver them into a NSData object.  The bytes are as follows:

var testBytes : [UInt8] = [0x14, 0x00, 0xAB, 0x45, 0x49, 0x1F, 0xEF, 0x15, 0xA8, 0x89, 0x78, 0x0F, 0x09, 0xA9, 0x07, 0xB0, 0x01, 0x20, 0x01, 0x4E, 0x38, 0x32, 0x35, 0x56, 0x20, 0x20, 0x20, 0x00]

//: ### Step 2
//: Convert the byte array into an **NSData** Object

var immutableData = NSData(bytes: testBytes, length: testBytes.count)

//: ### Step 3
//: Attempt to convert the **NSData** object into a string so it can be sent around as ascii.  This for some reason seems to be failing, however.

var convertedString = NSString(data: immutableData, encoding: NSUTF8StringEncoding)

println("String = \(convertedString)")

Results of Playgound Playgound的结果

在此输入图像描述

let testBytes : [UInt8] = [0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64]


func bytes2String(array:[UInt8]) -> String {
    return String(data: NSData(bytes: array, length: array.count), encoding: NSUTF8StringEncoding) ?? ""
}

Xcode 8.2 • Swift 3.0.2 Xcode 8.2•Swift 3.0.2

func bytes2String(_ array: [UInt8]) -> String {
    return String(data: Data(bytes: array, count: array.count), encoding: .utf8) ?? ""
}

Testing: 测试:

bytes2String(testBytes)  // "Hello World"

Use valid UTF8 characters! 使用有效的UTF8字符!

// Playground - noun: a place where people can play
import UIKit
var str = "Hello, playground"
import Foundation
//: # NSData to String Conversion Playground
//: ### Step 1
//: The first step is to take an array of bytes and conver them into a NSData object.  The bytes are as follows:

// Hello World
var testBytes : [UInt8] = [0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64]

//: ### Step 2
//: Convert the byte array into an **NSData** Object

var immutableData = NSData(bytes: testBytes, length: testBytes.count)

//: ### Step 3
//: Attempt to convert the **NSData** object into a string so it can be sent around as ascii.  This for some reason seems to be failing, however.

var convertedString = NSString(data: immutableData, encoding: NSUTF8StringEncoding)

println("String = \(convertedString)")

Your output will be: "String = Optional(Hello World)" 您的输出将是: "String = Optional(Hello World)"

If you just want hex values in string: 如果您只想在字符串中使用十六进制值:

I just want a string of the hex values. 我只想要一个十六进制值的字符串。 I guess this is trying to decode as actual ascii! 我想这是尝试解码为实际的ascii! Duh!! 咄! – Jeef Mar 4 at 23:29 - Jeef 3月4日23:29

The easiest way to do this is just use Swifts built in string interpolation. 最简单的方法是使用内置字符串插值的Swifts。

 let myHexString = "\(myNSDataObject)"

This will give you a string of hex with spaces between each two characters and surrounded by square brackets. 这将为您提供一个十六进制字符串,每两个字符之间有空格,并用方括号括起来。 Like this: 像这样:

 <a0 ff 21 4a>

You could format it with using the built in string methods: 您可以使用内置的字符串方法对其进行格式化:

 myHexString.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "<>")).stringByReplacingOccurrencesOfString(" ", withString: "")

You will have then have a string containing: a0ff214a 然后,您将拥有一个包含以下内容的字符串:a0ff214a

Using UTF8 in Swift 3.0 在Swift 3.0中使用UTF8

 let testBytes : [UInt8] = [0x14, 0x00, 0xAB, 0x45, 0x49, 0x1F, 0xEF, 0x15, 0xA8, 0x89, 0x78, 0x0F, 0x09, 0xA9, 0x07, 0xB0, 0x01, 0x20, 0x01, 0x4E, 0x38, 0x32, 0x35, 0x56, 0x20, 0x20, 0x20, 0x00]

 let immutableData = NSData(bytes: testBytes, length: testBytes.count)

 let convertedString = NSString(data: (immutableData as NSData) as Data, encoding:String.Encoding.utf8.rawValue)

 print("String = \(convertedString)")

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM