Swift調用OC之數據存儲-NSData

//*************************************

//

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章