//*************************************
//
// 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>