您的位置:首页 > 其它

万能的NSData各种数据类型之间的转化

2016-04-14 16:10 429 查看
数据皆字节!!!

大家常用NSData吗?反正我是之前不用,后来项目中一部分人是写C++,所以后来我会用到NSData会数据进行转化,看项目中代码:我想把数据存起来:第一可以用字典形式来存,第二种就是以万能的NSData来存,用的时候各自用合适的方法来取出来就好,看下边代码:

以NSData来存codeInfo tempListCode.GetItem(m, &codeInfo);

NSData *tempData = [NSData dataWithBytes:&codeInfo length:sizeof(codeInfo)];

[aTempArray addObject:tempData];


以字典形式来存(这个文件中我需要的是codeInfo的code,name,market,所以久存放这三个)



NSMutableDictionary* aDict = [NSMutableDictionary dictionary];

[aDict setObject:[NSString stringWithCString:codeInfo.Code encoding:NSUTF8StringEncoding] forKey:@"code"];

[aDict setObject:[NSString stringWithCString:codeInfo.Name encoding:NSUTF8StringEncoding] forKey:@"name"];

[aDict setObject:[NSString stringWithFormat:@"%d",codeInfo.MarketId] forKey:@"market"];


[aTempArray addObject:aDict];

用的时候这样来写:

NSData 取出来: NSData *tempData = [tempArray objectAtIndex:indexPath.row];

[tempData getBytes:&aRecord length:sizeof(aRecord)];

字典取出来:

NSDictionary *tempDic = [tempArray objectAtIndex:indexPath.row];

[[tempDic objectForKey:@"code"]getCString:aRecord.Code maxLength:sizeof(aRecord.Code) encoding:NSUTF8StringEncoding];

[[tempDic objectForKey:@"name"]getCString:aRecord.Name maxLength:sizeof(aRecord.Name) encoding:NSUTF8StringEncoding];

aRecord.MarketId = [[tempDic objectForKey:@"market"]integerValue];


1,NSData 与 NSString

  NSData --> NSString

  NSString *aString = [[NSString alloc] initWithData:adata encoding:NSUTF8StringEncoding];

  NSString --> NSData

  NSString *aString = @"1234";

  NSData *aData = [aString dataUsingEncoding: NSUTF8StringEncoding];


2,NSData 与 Byte

  NSData --> Byte

  NSString *testString = @"1234567890";

  NSData *testData = [testString dataUsingEncoding: NSUTF8StringEncoding];

  Byte *testByte = (Byte *)[testData bytes];

  Byte --> NSData

  Byte byte[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23};

  NSData *adata = [[NSData alloc] initWithBytes:byte length:24];

3,NSData 与 UIImage

  NSData --> UIImage

  UIImage *aimage = [UIImage imageWithData: imageData];

  //例:从本地文件沙盒中取图片并转换为NSData

  NSString *path = [[NSBundle mainBundle] bundlePath];

  NSString *name = [NSString stringWithFormat:@"ceshi.png"];

  NSString *finalPath = [path stringByAppendingPathComponent:name];

  NSData *imageData = [NSData dataWithContentsOfFile: finalPath];

  UIImage *aimage = [UIImage imageWithData: imageData];

  UIImage-> NSData

  NSData *imageData = UIImagePNGRepresentation(aimae);

4,NSData 与 NSMutableData

  NSData --> MSMutableData

  NSData *data=[[NSData alloc]init];

  NSMutableData *mdata=[[NSMutableData alloc]init];

  mdata=[NSData dataWithData:data];


5,NSData合并为一个NSMutableData

1 - (NSString *)filePathWithName:(NSString *)filename
2 {
3         NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
4         NSString *documentsDirectory = [paths objectAtIndex:0];
5         return [documentsDirectory stringByAppendingPathComponent:filename];
6 }
7
8 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
9     //音频文件路径
10         NSString *mp3Path1 = [[NSBundle mainBundle] pathForResource:@"1" ofType:@"mp3"];
11         NSString *mp3Path2 = [[NSBundle mainBundle] pathForResource:@"2" ofType:@"mp3"];
12         //音频数据
13         NSData *sound1Data = [[NSData alloc] initWithContentsOfFile: mp3Path1];
14         NSData *sound2Data = [[NSData alloc] initWithContentsOfFile: mp3Path2];
15         //合并音频
16         NSMutableData *sounds = [NSMutableData alloc];
17         [sounds appendData:sound1Data];
18         [sounds appendData:sound2Data];
19         //保存音频
20
21         NSLog(@"data length:%d", [sounds length]);
22
23         [sounds writeToFile:[self filePathWithName:@"tmp.mp3"] atomically:YES];
24
25         [window makeKeyAndVisible];
26
27     return YES;
28 }


总结:

1、当需要使用int类型的变量的时候,可以像写C的程序一样,用int,也可以用NSInteger,但更推荐使用NSInteger,因为这样就不用考虑设备是32位的还是64位的。
2、NSUInteger是无符号的,即没有负数,NSInteger是有符号的。
3、注意:既然都有了NSInteger等这些基础类型了为什么还要有NSNumber?它们的功能当然是不同的。
NSInteger是基础类型,但是NSNumber是一个类。如果想要存储一个数值,直接用NSInteger是不行的,比如在一个Array里面这样用:
<span style="font-size: 12px;">NSMutableArray *array= [[NSMutableArray alloc]init];
[array addObject:3];//会编译错误</span>

这样是会引发编译错误的,因为NSMutableArray里面放的需要是一个类,但‘3’不是。这个时候需要用到NSNumber:
<span style="font-size: 12px;">NSArray *array= [[NSArray alloc]init];
[array addObject:[NSNumber numberWithInt:3]];</span>

Cocoa提供了NSNumber类来包装(即以对象形式实现)基本数据类型。
例如以下创建方法:
<span style="font-size: 12px;">+ (NSNumber*)numberWithChar: (char)value;
+ (NSNumber*)numberWithInt: (int)<a target=_blank style="margin: 0px; padding: 0px; color: rgb(226, 90, 2); text-decoration: underline;" href="http://www.wuleilei.com/blog/333">value</a>;
+ (NSNumber*)numberWithFloat: (float)value;
+ (NSNumber*)numberWithBool: (BOOL) value;</span>

将基本类型数据封装到NSNumber中后,就可以通过下面的实例方法重新获取它:
<span style="font-size: 12px;">- (char)charValue;
- (int)intValue;
- (float)floatValue;
- (BOOL)boolValue;
- (NSString*)stringValue;</span>


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: