cocoa二进制数据编程

Cocoa框架提供数据对象(NSData/NSMutableData),用于封装二进制数据,支持在Foundation和Core Foundation间桥接。这些对象自动管理内存,可用于集合、属性列表、文件存储及网络传输。可以通过原始字节、文件或URL创建数据对象,并使用方法获取或拷贝字节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据对象(data object):

二进制数据能被包装进Foundation和Core Foundation数据对象中,数据对象提供了操作数据的面向对象封装。

数据对象是桥接对象(bridged objects),所以你能在Foundation和Core Foundation中自由切换。数据对象

能自动的分配和回收数据缓冲区。数据对象(data objects)还能被存储在集合中,能被写入属性列表,存入文件,通过通信端口传输等。

数据对象的应用:



从原始字节(raw bytes)创建数据对象

一般用以data开头的NSData或NSMutableData类方法创建包含这些原始字节的数据对象。


从文件和URLs中创建对象:

dataWithContentsOfFile: or dataWithContentsOfURL:类方法创建数据对象,数据对象中包含文件或者URL的内容

NSString *thePath = @"/u/smith/myFile.txt";
NSData *myData = [NSData dataWithContentsOfFile:thePath];


访问和比较字节:

NSData的两个原始bytes和length方法为类的其他方法提供了基础。

bytes返回一个指向包含数据的数据对象。length方法返回数据对象包含的字节数量。

NSData提供了从一个数据对象中访问字节或者拷贝字节到指定缓冲区的方法。getBytes:方法拷贝所有的

字节到一个缓冲区。

unsigned char aBuffer[20];
NSString *myString = @"Test string.";
const char *utfString = [myString UTF8String];
NSData *myData = [NSData dataWithBytes: utfString length: strlen(utfString)];
 
[myData getBytes:aBuffer];

抽取一个数据对象的内容是否是另外数据对象的子集:

NSString *myString = @"ABCDEFG";
const char *utfString = [myString UTF8String];
NSRange range = {2, 4};
NSData *data1, *data2;
 
data1 = [NSData dataWithBytes:utfString length:strlen(utfString)];
 
data2 = [data1 subdataWithRange:range];

存储数据对象:

writeToFile:atomically:把数据存储到一个本地文件中 和 writeToURL:atomically:把数据存储到指定的网络地方。


可变数据对象:NSMutableData

改变bytes

NSMutableData *data1, *data2;
NSString *myString = @"string for data1";
NSString *yourString = @"string for data2";
const char *utfMyString = [myString UTF8String];
const char *utfYourString = [yourString UTF8String];
unsigned char *firstBuffer, secondBuffer[20];
 
/* initialize data1, data2, and secondBuffer... */
data1 = [NSMutableData dataWithBytes:utfMyString length:strlen(utfMyString)+1];
data2 = [NSMutableData dataWithBytes:utfYourString length:strlen(utfYourString)+1];
 
[data2 getBytes:secondBuffer];
NSLog(@"data2 before: \"%s\"\n", (char *)secondBuffer);
 
firstBuffer = [data2 mutableBytes];
[data1 getBytes:firstBuffer];
NSLog(@"data1: \"%s\"\n", (char *)firstBuffer);
 
[data2 getBytes:secondBuffer];
NSLog(@"data2 after: \"%s\"\n", (char *)secondBuffer);
在bytes后加入

NSMutableData *data1, *data2;
NSString *firstString  = @"ABCD";
NSString *secondString = @"EFGH";
const char *utfFirstString = [firstString UTF8String];
const char *utfSecondString = [secondString UTF8String];
unsigned char *aBuffer;
unsigned len;
 
data1 = [NSMutableData dataWithBytes:utfFirstString length:strlen(utfFirstString)];
data2 = [NSMutableData dataWithBytes:utfSecondString length:strlen(utfSecondString)];
 
len = [data2 length];
aBuffer = malloc(len);
 
[data2 getBytes:aBuffer];
[data1 appendBytes:aBuffer length:len];

置换bytes

NSMutableData *data1, *data2;
NSString *myString = @"Liz and John";
NSString *yourString = @"Larry";
const char *utfMyString = [myString UTF8String];
const char *utfYourString = [yourString UTF8String];
unsigned len;
unsigned char *aBuffer;
NSRange range = {8, strlen(utfYourString)};
 
data1 = [NSMutableData dataWithBytes:utfMyString length:strlen(utfMyString)];
data2 = [NSMutableData dataWithBytes:utfYourString length:strlen(utfYourString)];
 
len = [data2 length];
aBuffer = malloc(len);
[data2 getBytes:aBuffer];
[data1 replaceBytesInRange:range withBytes:aBuffer];




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值