前言

public class NSData : NSObject, NSCopying, NSMutableCopying, NSSecureCoding
    public class NSMutableData : NSData
    public class NSData : NSObject, NSCopying, NSMutableCopying, NSSecureCoding
    public class NSMutableData : NSData
  • NSData 和它的可变长子类 NSMutableData 是字节缓冲区的对象化封装。我们可以获得简单缓冲区,并进行一些转换操作。通常我们并不会直接创建字节数据,而是从其他类型的内容转换成字节数据。
  • 所谓简单缓冲区,就是缓冲区内只包含数据,无内嵌指针。

1、NSData 的创建

// 由字符串创建
    let swiftString:String = "Hello World"
    let nsString:NSString = "hello world"
        
    // allowLossyConversion 表示在转换过程中是否允许字符进行必要的删减或者替换  
    let data1:NSData? = swiftString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
    let data2:NSData? = nsString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
    
    // 由已知数据创建,两个对象的地址不相同
    let data3:NSData = NSData(data: data1!)
        
    // 由文件创建
    let data4:NSData? = NSData(contentsOfFile: NSHomeDirectory().stringByAppendingString("/Desktop/test.txt"))
        
    // 由 URL 创建
    let data5:NSData? = NSData(contentsOfURL: NSURL(string: "http://www.baidu.com")!)
        
    // 可变 Data 的创建
            
        // 初始化时指定对象拥有的字节空间大小,在需要时会增加内存空间,在初始化时并没有分配内存空间
        let data6:NSMutableData? = NSMutableData(capacity: 0)
            
        // 初始化时为对象分配指定长度的归零字节
        let data7:NSMutableData? = NSMutableData(length: 10)
    // 由字符串创建
    let swiftString:String = "Hello World"
    let nsString:NSString = "hello world"
        
    // allowLossyConversion 表示在转换过程中是否允许字符进行必要的删减或者替换  
    let data1:NSData? = swiftString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
    let data2:NSData? = nsString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
    
    // 由已知数据创建,两个对象的地址不相同
    let data3:NSData = NSData(data: data1!)
        
    // 由文件创建
    let data4:NSData? = NSData(contentsOfFile: NSHomeDirectory().stringByAppendingString("/Desktop/test.txt"))
        
    // 由 URL 创建
    let data5:NSData? = NSData(contentsOfURL: NSURL(string: "http://www.baidu.com")!)
        
    // 可变 Data 的创建
            
        // 初始化时指定对象拥有的字节空间大小,在需要时会增加内存空间,在初始化时并没有分配内存空间
        let data6:NSMutableData? = NSMutableData(capacity: 0)
            
        // 初始化时为对象分配指定长度的归零字节
        let data7:NSMutableData? = NSMutableData(length: 10)

2、数据的长度

let data1:NSData = "Hello World".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!
        
    // 指定空间大小,不分配空间
    let data2:NSMutableData = NSMutableData(capacity: 10)!
        
    // 分配指定长度的归零字节
    let data3:NSMutableData = NSMutableData(length: 10)!
        
    // 字节长度的计算,NSData 的 length 属性是只读的,字节长度的计算,NSMutableData 的 length 可以被重新赋值
    let num1:Int = data1.length
    let num2:Int = data2.length
    let num3:Int = data3.length
        
    // 重新设置空间的大小,对象的字节空间会相应的扩充或者截断。如果新设置的大小大于当前大小,
    // 会在当前数据的末尾处用归零字节来进行填充。如果新设置的大小小于当前大小,数据会被截断抛弃。
    data2.length = 5
    data3.length = 5
    
    // 扩充指定长度,新添加的空间被设置为归零字节
    data2.increaseLengthBy(7)
    data3.increaseLengthBy(7)
    let data1:NSData = "Hello World".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!
        
    // 指定空间大小,不分配空间
    let data2:NSMutableData = NSMutableData(capacity: 10)!
        
    // 分配指定长度的归零字节
    let data3:NSMutableData = NSMutableData(length: 10)!
        
    // 字节长度的计算,NSData 的 length 属性是只读的,字节长度的计算,NSMutableData 的 length 可以被重新赋值
    let num1:Int = data1.length
    let num2:Int = data2.length
    let num3:Int = data3.length
        
    // 重新设置空间的大小,对象的字节空间会相应的扩充或者截断。如果新设置的大小大于当前大小,
    // 会在当前数据的末尾处用归零字节来进行填充。如果新设置的大小小于当前大小,数据会被截断抛弃。
    data2.length = 5
    data3.length = 5
    
    // 扩充指定长度,新添加的空间被设置为归零字节
    data2.increaseLengthBy(7)
    data3.increaseLengthBy(7)

3、数据的获取

let data:NSData = "Hello World".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!
        
    // 默认为内容数据的十六进制编码
    let dataFromNSData1 = data.description                      
        
    let dataFromNSData2:NSString? = NSString(data: data, encoding: NSUTF8StringEncoding)
        
    let dataFromNSData3:NSString? = NSString(bytes: data.bytes, length: data.length, encoding: NSUTF8StringEncoding)
    let data:NSData = "Hello World".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!
        
    // 默认为内容数据的十六进制编码
    let dataFromNSData1 = data.description                      
        
    let dataFromNSData2:NSString? = NSString(data: data, encoding: NSUTF8StringEncoding)
        
    let dataFromNSData3:NSString? = NSString(bytes: data.bytes, length: data.length, encoding: NSUTF8StringEncoding)

4、NSData 的比较

let data1:NSData = "Hello World".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!
    let data2:NSData = NSData(data: data1)
        
    // 比较两个对象的地址是否一致
    let bl1:Bool = data1 === data2
        
    // 比较两个对象的长度及每字节的数据是否相同
    let bl2:Bool = data1.isEqualToData(data2)
    let data1:NSData = "Hello World".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!
    let data2:NSData = NSData(data: data1)
        
    // 比较两个对象的地址是否一致
    let bl1:Bool = data1 === data2
        
    // 比较两个对象的长度及每字节的数据是否相同
    let bl2:Bool = data1.isEqualToData(data2)

5、NSData 的存储

let data:NSData = "Hello World".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!
        
    // 将数据写入 file
    let bl1:Bool = data.writeToFile(NSHomeDirectory().stringByAppendingString("/Desktop/test.txt"), atomically: true)
        
    // 将数据写入 URL,该方法只支持 file:// 路径的文件写入,并不能对远程如 http:// 等类型文件进行写入
    let bl2:Bool = data.writeToURL(NSURL(string: "file://".stringByAppendingFormat("%@%@", 
                                                         NSHomeDirectory(), "/Desktop/test.txt"))!, atomically: true)
    let data:NSData = "Hello World".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!
        
    // 将数据写入 file
    let bl1:Bool = data.writeToFile(NSHomeDirectory().stringByAppendingString("/Desktop/test.txt"), atomically: true)
        
    // 将数据写入 URL,该方法只支持 file:// 路径的文件写入,并不能对远程如 http:// 等类型文件进行写入
    let bl2:Bool = data.writeToURL(NSURL(string: "file://".stringByAppendingFormat("%@%@", 
                                                         NSHomeDirectory(), "/Desktop/test.txt"))!, atomically: true)

6、NSData 与 字符串 的相互转换

let string:String = "Hello World"
        
    // 字符串 转 NSData
    let data:NSData = string.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!
        
    // NSData 转 字符串
    let utf8String:NSString = NSString(data: data, encoding: NSUTF8StringEncoding)!
    let string:String = "Hello World"
        
    // 字符串 转 NSData
    let data:NSData = string.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!
        
    // NSData 转 字符串
    let utf8String:NSString = NSString(data: data, encoding: NSUTF8StringEncoding)!

7、NSData 与 Base64编码字符串 的相互转换

let data:NSData = "Hello World".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!
        
    // NSData 转换为 Base64编码的字符串
    let base64String:String = data.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
        
    // Base64编码的字符串 转换为 NSData
    let nsData:NSData? = NSData(base64EncodedString: base64String, options: NSDataBase64DecodingOptions(rawValue: 0))
    let data:NSData = "Hello World".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!
        
    // NSData 转换为 Base64编码的字符串
    let base64String:String = data.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
        
    // Base64编码的字符串 转换为 NSData
    let nsData:NSData? = NSData(base64EncodedString: base64String, options: NSDataBase64DecodingOptions(rawValue: 0))