//*************************************
//
// Swift调用OC之数据存储NSData
//
// NSData的对象可以看做是缓冲区
// NSData是静态缓冲区(大小固定),NSMutableData是动态的
//
// 1.创建NSData
// 2.访问数据(读取NSData)
// 3.比较数据是否相同
// 4.字节数据与Base64编码字符串互转
// 5.字节数据存储
//6.NSMutableData
//
//*************************************
import Foundation
//***************************************
//********* 1.创建NSData **********
//***************************************
//初始化方法1.将其他类型转换成NSData类型(比如String)
//使用dataUsingEncoding方法
//参数1:编码格式,字典有NSUTF8StringEncoding,NSUnicodeStringEncoding,NSASCIIStringEncoding
//参数2:是否允许转换,比如替换特殊字符
let string1 = "HelloWorld"
letutf8EncodeData : NSData! = string1.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true) //将字符串进行UTF8编码成NSData
//初始化方法2:指定一块新的内存空间
let withData = NSData(data: utf8EncodeData!)
//3.初始化方法3:指定contentsOfUrl参数,用URL对应地址内容数据来初始化NSData
let url = NSURL(string: "https://www.163.com/in123/hello.html")
let withContentUrl = NSData(contentsOfURL: url!)
println(withContentUrl)
//初始化方法4:指定contentsOfFile参数,用文件路径所对应的内容数据来初始化NSData
//PS:CommandLine是没有Bundle的,Application才有
//需要在Target-Copy Bundle Resource里面添加了文件才能获取到文件路径
var filePath = NSBundle.mainBundle().pathForResource("3001",ofType: "jpg")
iffilePath != nil {
var withPath = NSData(contentsOfFile: filePath!)
}else{
println("filePath = nil")
}
//***************************************
//******* 2.访问数据(读取NSData) **********
//***************************************
//使用description属性
let desc001 = utf8EncodeData.description
let desc002 = withData.description
//全都一样=<48656c6c 6f20576f 726c64>
println("utf8EncodeData=\(utf8EncodeData)")
println("desc001=\(desc001)")
println("withData=\(withData)")
println("desc001=\(desc001)")
//解码:
//方法1:使用.bytes属性获得NSData数据对象内容的byte数组指针,使用length获取数据字节数组的长度
var pointer = utf8EncodeData.bytes
var stringFromData1 : NSString! = NSString(bytes: pointer, length: utf8EncodeData.length, encoding: NSUTF8StringEncoding)
println(stringFromData1) //HelloWorld
//方法2: so easy...
var stringFromData2 : NSString! = NSString(data: utf8EncodeData,encoding: NSUTF8StringEncoding)
//***************************************
//********* 3.比较数据是否相同 **********
//***************************************
//方法1:使用"==="
//方法2:使用isEqualToData
let str1 = "Hello"
let str2 = "hello"
let nsData1 : NSData! = str1.dataUsingEncoding(NSUTF8StringEncoding,allowLossyConversion: true)
let nsData2 : NSData! = str2.dataUsingEncoding(NSUTF8StringEncoding,allowLossyConversion: true)
let Bool1 : Bool = nsData1 === nsData2 //false
let Bool2 = nsData1.isEqualToData(nsData1) //true
//******************************************************
//
//**** 4.字节数据与Base64编码字符串互转 *****
//用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到
//
//******************************************************
//数据传输中,往往将NSData对象进行Base64字符串编码及反编码(接收)
let str401 = "HelloO"
//Step1:UTF编码称NSData
let nsData401 : NSData! = str401.dataUsingEncoding(NSUTF8StringEncoding,allowLossyConversion: true)
//Step2:将NSData进行Base64编码生成字符串
let base64str401 = nsData401.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.allZeros) //"SGVsbG9P"
//Step3:将Base64字符串解码为NSData
let base64data = NSData(base64EncodedString:base64str401, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)
//Step4:将NSData转码为string
let strWithDecode401 =NSString(data:base64data!, encoding: NSUTF8StringEncoding)
println(strWithDecode401!) //HelloO
//******************************************
//
//**** 5.字节数据存储 *****
//
//******************************************
//例子:将一个字符串存储到Documents文档目录下
letstring501 = "字节数据存储"
let utf8ECData = string501.dataUsingEncoding(NSUTF8StringEncoding,allowLossyConversion: true)
var pathArray: Array = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
var defaultPath = pathArray[0] as String
let textPath = defaultPath + "/text.txt"
//println(pathArray)
println(defaultPath)
//上面两个路径是一样的都是Users/EvaZis-Pro/Library/Containers/com.apple.dt.playground.stub.OSX.C01-NSData-xxxx(xxxx这段会变化)/Data/Documents,这是一个沙箱目录
//println(textPath)
let result = utf8ECData?.writeToFile(textPath, atomically: true) //这句写文件,true表示先写入到一个备份文件中,如果没有抛出异常,再将文件重命名成path参数设置的名称,可以避免写入异常导致数据损坏;如果是false则直接写入对应的路径
println("write to fileresule : \(result)")
//下面的方法支持写入file://路径,但不支持写入远程路径如http:// ....
//letresult = utf8ECData?.writeToURL(textPath, atomically: true)
//******************************************
//
//**** 6.NSMutableData *****
//
//******************************************
//初始化方法1:指定初始大小,该空间后续可以变化
var mutableData1 : NSMutableData! = NSMutableData(capacity:10)
println(mutableData1) // <>
mutableData1.length // 10
//初始化方法2:指定初始大小并将内容归零,该空间后续可以变化
var mutableData2 : NSMutableData! = NSMutableData(length: 10)
println(mutableData2) // <00000000 00000000 0000>
mutableData2.length // 10
//扩充长度
mutableData2.increaseLengthBy(3)
println(mutableData2) // <00000000 00000000 00000000 00>
mutableData2.length // 13
//重新赋值长度,则内容会截取或者扩充
mutableData2.length = 5
println(mutableData2) // <00000000 00>
mutableData2.length = 7
println(mutableData2) // <00000000 000000>