NSData 数据

前言

  • NSData 数据

    • Objective-C

      1
      2
      @interface NSData : NSObject <NSCopying, NSMutableCopying, NSSecureCoding>
      @interface NSMutableData : NSData
    • Swift

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

    • 所谓简单缓冲区,就是缓冲区内只包含数据,无内嵌指针。

    • 对于 32 位应用程序,NSData 的缓冲区最多可以存储 2GB 数据。对于 64 位应用程序,最多可以存储 8EB(即 8 亿 GB) 数据。

1、NSData 的创建

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    // 对象方法创建
    NSData *data1 = [[NSData alloc] init];
    NSData *data2 = [[NSData alloc] initWithData:data1];

    // 类方法创建
    NSData *data3 = [NSData data];
    NSData *data4 = [NSData dataWithData:data3];

    // 由 文件 创建
    NSString *filePath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/test.txt"];

    NSData *data5 = [[NSData alloc] initWithContentsOfFile:filePath];
    NSData *data6 = [NSData dataWithContentsOfFile:filePath];

    // 由 URL 创建
    NSURL *urlPath = [NSURL URLWithString:[@"file://" stringByAppendingString:[NSHomeDirectory()
    stringByAppendingString:@"/Desktop/test.txt"]]];

    NSData *data7 = [[NSData alloc] initWithContentsOfURL:urlPath];
    NSData *data8 = [NSData dataWithContentsOfURL:urlPath];

    // 由 字符串 创建
    NSString *string = @"bei jing nin hao";

    NSData *data9 = [string dataUsingEncoding:NSUTF8StringEncoding];
    NSData *data10 = [string dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];

    // 可变 NSData 的创建

    // 初始化时指定对象拥有的字节空间大小,在需要时会增加内存空间,在初始化时并没有分配内存空间
    NSMutableData *data11 = [[NSMutableData alloc] initWithCapacity:5];
    NSMutableData *data12 = [NSMutableData dataWithCapacity:5];

    // 初始化时为对象分配指定长度的归零字节
    NSMutableData *data13 = [[NSMutableData alloc] initWithLength:10];
    NSMutableData *data14 = [NSMutableData dataWithLength:10];
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    // 由字符串创建
    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、NSData 长度的计算

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    NSData *data1 = [@"bei jing nin hao" dataUsingEncoding:NSUTF8StringEncoding];

    // 指定空间大小,不分配空间
    NSMutableData *data2 = [NSMutableData dataWithCapacity:5];

    // 分配指定长度的归零字节
    NSMutableData *data3 = [NSMutableData dataWithLength:10];


    // 字节长度的计算,NSData 的 length 属性是只读的
    NSUInteger length1 = data1.length;

    // 字节长度的计算,NSMutableData 的 length 可以被重新赋值
    NSUInteger length2 = data2.length;

    NSUInteger length3 = data3.length;

    // 重新设置空间的大小,对象的字节空间会相应的扩充或者截断。如果新设置的大小大于当前大小,会在当前数据的
    data2.length = 15;

    // 末尾处用归零字节来进行填充。如果新设置的大小小于当前大小,数据会被截断抛弃。
    data3.length = 15;

    // 扩充指定长度,新添加的空间被设置为归零字节
    [data2 increaseLengthBy:5];
    [data3 increaseLengthBy:5];
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    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、NSData 数据的获取

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    NSData *data = [@"bei jing nin hao" dataUsingEncoding:NSUTF8StringEncoding];

    // 默认为内容数据的十六进制编码
    NSString *str1 = data.description;

    NSString *str2 = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSString *str3 = [[NSString alloc] initWithBytes:data.bytes length:data.length encoding:NSUTF8StringEncoding];
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    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 的比较

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    NSData *data1 = [@"bei jing nin hao" dataUsingEncoding:NSUTF8StringEncoding];
    NSData *data2 = [NSData dataWithData:data1];

    // 比较两个对象的地址是否一致
    BOOL bl1 = data1 == data2;

    // 比较两个对象的长度及每字节的数据是否相同
    BOOL bl2 = [data1 isEqualToData:data2];
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    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 的存储

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    NSData *data = [@"bei jing nin hao" dataUsingEncoding:NSUTF8StringEncoding];

    // 将数据写入 file
    NSString *filePath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/NSDataTest.txt"];
    BOOL bl1 = [data writeToFile:filePath atomically:YES];

    // 将数据写入 URL

    // 该方法只支持 file:// 路径的文件写入,并不能对远程如 http:// 等类型文件进行写入
    NSURL *urlPath = [NSURL URLWithString:[@"file://" stringByAppendingString:[NSHomeDirectory()
    stringByAppendingString:@"/Desktop/NSDataTest.txt"]]];
    BOOL bl2 = [data writeToURL:urlPath atomically:YES];
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    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 与 NSString 的相互转换

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    NSString *string = @"bei jing nin hao";

    // NSString 转 NSData
    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];

    // data 类型数据以十六进制的形式打印出
    NSLog(@"%@", data);

    // data 类型数据以字符串的形式打印出
    NSLog(@"%s", data.bytes);

    // NSData 转 NSString
    NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  • Swift

    1
    2
    3
    4
    5
    6
    7
    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编码字符串 的相互转换

  • Swift

    1
    2
    3
    4
    5
    6
    7
    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))
文章目录
  1. 1. 前言
  2. 2. 1、NSData 的创建
  3. 3. 2、NSData 长度的计算
  4. 4. 3、NSData 数据的获取
  5. 5. 4、NSData 的比较
  6. 6. 5、NSData 的存储
  7. 7. 6、NSData 与 NSString 的相互转换
  8. 8. 7、NSData 与 Base64编码字符串 的相互转换
隐藏目录