怎么把NSData把文件转为byte数组类型

2.7k 次阅读
标签:至少1个,最多5个
在做iOS开发中一个很常见的应用场景就是从服务器接收一段数据然后把它显示出来。但是有时候服务器在数据处理时,比如拼接之类的操作,会出一些问题,造成传过来的数据并不符合指定的编码。(我碰到过的一种情况是,一段宣称用GB18030编码的文字中突然出现了几个用UTF8编码的词语)。浏览器在处理这个问题时,一般就会出现乱码,常用的编程语言在处理这个问题时,也是以乱码显示,而ObjC的NSString则直接返回了一个nil。这一直让我比较头疼,在旧版股吧的开发中曾经碰到因为接口返回的数据里面有一个字节是错的,导致整个接口返回的数据不能用了,当时在国内几个网站上,得到的都是一些不靠谱的回答。
今天同事又遇到了这个问题,不过他找到了如何让UTF8编码的里面混有错误字节的数据,以容错的方式显示出来而不是nil(见),其实原理很简单,一个一个字节读过来,参照UTF8编码的说明,判断是不是合法字节,如果不是,用“?”来代替。根据这段代码,我改了一个用于GB18030编码的混有不合法字节的数据的容错转换。
NSData+HG_DataHealing.h
#import &Foundation/Foundation.h&
@interface NSData (HG_DataHealing)
- (NSString *)GB18030S
NSData+HG_DataHealing.m
#import "NSData+HG_DataHealing.h"
@implementation NSData (HG_DataHealing)
- (NSString *)GB18030String {
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_);
NSString *str = [[NSString alloc]initWithData:self encoding:enc];
if (!str) {
str = [[NSString alloc]initWithData:[self dataByHealingGB18030Stream] encoding:enc];
- (NSData *)dataByHealingGB18030Stream {
NSUInteger length = [self length];
if (length == 0) {
static NSString * replacementCharacter = @"?";
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_);
NSData *replacementCharacterData = [replacementCharacter dataUsingEncoding:enc];
NSMutableData *resultData = [NSMutableData dataWithCapacity:self.length];
const Byte *bytes = [self bytes];
static const NSUInteger bufferMaxSize = 1024;
Byte buffer[bufferMaxSize];
NSUInteger bufferIndex = 0;
NSUInteger byteIndex = 0;
BOOL invalidByte = NO;
#define FlushBuffer() if (bufferIndex & 0) { \
[resultData appendBytes:buffer length:bufferIndex]; \
bufferIndex = 0; \
#define CheckBuffer() if ((bufferIndex+5) &= bufferMaxSize) { \
[resultData appendBytes:buffer length:bufferIndex]; \
bufferIndex = 0; \
while (byteIndex & length) {
Byte byte = bytes[byteIndex];
//检查第一位
if (byte &= 0 && byte &= (Byte)0x7f) {
//单字节文字
CheckBuffer();
buffer[bufferIndex++] =
} else if (byte &= (Byte)0x81 && byte &= (Byte)0xfe){
//可能是双字节,可能是四字节
if (byteIndex + 1 &= length) {
//这是最后一个字节了,但是这个字节表明后面应该还有1或3个字节,那么这个字节一定是错误字节
FlushBuffer();
return resultD
Byte byte2 = bytes[++byteIndex];
if (byte2 &= (Byte)0x40 && byte &= (Byte)0xfe && byte != (Byte)0x7f) {
//是双字节,并且可能合法
Byte tuple[] = {byte, byte2};
CFStringRef cfstr = CFStringCreateWithBytes(kCFAllocatorDefault, tuple, 2, kCFStringEncodingGB_, false);
if (cfstr) {
CFRelease(cfstr);
CheckBuffer();
buffer[bufferIndex++] =
buffer[bufferIndex++] = byte2;
//这个双字节字符不合法,但byte2可能是下一字符的第一字节
byteIndex -= 1;
invalidByte = YES;
} else if (byte2 &= (Byte)0x30 && byte2 &= (Byte)0x39) {
//可能是四字节
if (byteIndex + 2 &= length) {
FlushBuffer();
return resultD
Byte byte3 = bytes[++byteIndex];
if (byte3 &= (Byte)0x81 && byte3 &= (Byte)0xfe) {
// 第三位合法,判断第四位
Byte byte4 = bytes[++byteIndex];
if (byte4 &= (Byte)0x30 && byte4 &= (Byte)0x39) {
//第四位可能合法
Byte tuple[] = {byte, byte2, byte3, byte4};
CFStringRef cfstr = CFStringCreateWithBytes(kCFAllocatorDefault, tuple, 4, kCFStringEncodingGB_, false);
if (cfstr) {
CFRelease(cfstr);
CheckBuffer();
buffer[bufferIndex++] =
buffer[bufferIndex++] = byte2;
buffer[bufferIndex++] = byte3;
buffer[bufferIndex++] = byte4;
//这个四字节字符不合法,但是byte2可能是下一个合法字符的第一字节,回退3位
//并且将byte1,byte2用?替代
byteIndex -= 3;
invalidByte = YES;
//第四字节不合法
byteIndex -= 3;
invalidByte = YES;
// 第三字节不合法
byteIndex -= 2;
invalidByte = YES;
// 第二字节不是合法的第二位,但可能是下一个合法的第一位,所以回退一个byte
invalidByte = YES;
byteIndex -= 1;
if (invalidByte) {
invalidByte = NO;
FlushBuffer();
[resultData appendData:replacementCharacterData];
byteIndex++;
FlushBuffer();
return resultD
1 收藏&&|&&5
你可能感兴趣的文章
但问题有两个:1、如果是其他编码的,也会被错误地解析出来,而不是返回nil2、效率太低
但问题有两个:
1、如果是其他编码的,也会被错误地解析出来,而不是返回nil
2、效率太低
你可能感兴趣的文章
分享到微博?
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
(转)Object-C 中各数据类型转换 NSData转NSString,Byte,UIImage
摘要:1,NSData与NSStringNSData--&NSStringNSString*aString=[[NSStringalloc]initWithData:adataencoding:NSUTF8StringEncoding];NSString--&NSDataNSString*aString=@&1234&;NSData*aData=[aStringdataUsingEncoding:NSUTF8StringEncoding];2,NSD
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 = @&&;
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- (NSString *)filePathWithName:(NSString *)filename {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return [documentsDirectory stringByAppendingPathComponent:filename]; }
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//音频文件路径
NSString *mp3Path1 = [[NSBundle mainBundle] pathForResource:@&1& ofType:@&mp3&];
NSString *mp3Path2 = [[NSBundle mainBundle] pathForResource:@&2& ofType:@&mp3&];
//音频数据
NSData *sound1Data = [[NSData alloc] initWithContentsOfFile: mp3Path1];
NSData *sound2Data = [[NSData alloc] initWithContentsOfFile: mp3Path2];
//合并音频
NSMutableData *sounds = [NSMutableData alloc];
[sounds appendData:sound1Data];
[sounds appendData:sound2Data];
//保存音频
NSLog(@&data length:%d&, [sounds length]);
[sounds writeToFile:[self filePathWithName:@&tmp.mp3&] atomically:YES];
[window makeKeyAndVisible];
return YES; }
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
邮箱低至5折
推荐购买再奖现金,最高25%
&200元/3月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
(转)Object-C 中各数据类型转换 NSData转NSString,Byte,UIImage相关信息,包括
的信息,所有(转)Object-C 中各数据类型转换 NSData转NSString,Byte,UIImage相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International怎么将nsdata 转换为 byte_百度知道
怎么将nsdata 转换为 byte
我有更好的答案
NSData *testData = [@“测试数据” dataUsingEncoding: NSUTF8StringEncoding];Byte *testByte = (Byte *)[testData bytes];for(int i=0;i&[testData length];i++)printf(&testByte = %d\n&,testByte[i]);
电子产品技术支持
这个不懂,只能帮你找个相关链接,你看看
本回答被提问者和网友采纳
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。NSData与Byte
[NSData bytes]返回的是Byte类型的,Byte是unsigned char,Byte可以是个数组,打印Byte需要遍历打印
Byte *byte = (Byte *)[cipher bytes];
for (int i = 0; i & [cipher length]; i ++) {
NSLog(@"data转字节byte = %d", byte[i]);
}OC创建字节数组的方式
[data bytes];
2.需要编辑,并且关于data
NSUInteger length = [data length];
unsigned char *bytes = malloc( length * sizeof(unsigned char) ); // 使用malloc创建字节数组
[data getBytes:bytes length:length];// 将data中数据copy到字节数组中或者
- (NSArray*) arrayOfBytesFromData:(NSData*) data {
if (data.length & 0)
&span style="white-space:pre"& &/span&NSMutableArray *array = [NSMutableArray arrayWithCapacity:data.length];
&span style="white-space:pre"& &/span&NSUInteger i = 0;
&span style="white-space:pre"& &/span&for (i = 0; i & data. i++)
&span style="white-space:pre"& &/span&{&span style="white-space:pre"& &/span&unsigned char byteFromArray = data.bytes[i];
&span style="white-space:pre"& &/span&[array addObject:[NSValue valueWithBytes:&byteFromArrayobjCType:@encode(unsigned char)]];
&span style="white-space:pre"& &/span&}
&span style="white-space:pre"& &/span&return [NSArray arrayWithArray:array];
没有更多推荐了,怎样将NSData里的数据按照byte,一个一个读出来_百度知道
怎样将NSData里的数据按照byte,一个一个读出来
我有更好的答案
单一字节发送接收可以,只能说明软件、硬件,基本调通;要想传送数据,还必须制定通信协议。发送方,先向对方呼叫,待收到正确的回音后;再向对方发送“数据的字节数”;再向对方连续发送数据字节串,对方收到,存放到一个缓存空间;发送方,最后向对方发出校验字节(一般是累加和);待收到正确的回音后,一次数据通信才算结束。
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 java 把文件转为byte 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信