当用nsdata,按照utf8编码来初始化nsstring时,如果nsdata出现了非法utf-8编码,nsstring就回返回空,这不是我所期望的,对于非法的字节,可以用A代替。
按照utf8格式标准,
U+00000000 - U+0000007F: 0 xxxxxxx 0x - 7x
U+00000080 - U+000007FF: 110 xxxxx 10 xxxxxx Cx 8x - Dx Bx
U+00000800 - U+0000FFFF: 1110 xxxx 10 xxxxxx 10 xxxxxx Ex 8x 8x - Ex Bx Bx
U+00010000 - U+001FFFFF: 11110 xxx 10 xxxxxx 10 xxxxxx 10 xxxxxx F0 8x 8x 8x - F7 Bx Bx Bx 很少用
U+00200000 - U+03FFFFFF: 111110 xx 10 xxxxxx 10 xxxxxx 10 xxxxxx 10 xxxxxx F8 8x 8x 8x 8x - FB Bx Bx Bx Bx
U+04000000 - U+7FFFFFFF: 1111110 x 10 xxxxxx 10 xxxxxx 10 xxxxxx 10 xxxxxx 10 xxxxxx FC 8x 8x 8x 8x 8x - FD Bx Bx Bx Bx Bx
如果一个字节小于0x80,那么他就是一个字符,如果大于C0小于E0,表示有2个字节是utf8,第一个是110开头的,第二个是10开头的,如果大于E0小于F0,表示3个字节是utf8,第一个是1110开头的,第二个是10开头的,第三个是10开头的,如果不是表明非法,将非法的字节设置为A,即可。
如何判断一个字节是否是110开头的或者是1110开头的呢?用b & 0xE0 == 0xC0,类推,判断是否是1110开头的,b&0xF0 == 0xE0。
经过这一的转化,nsstring就能初始化了。
代码如下:
//将nsdata中的非法字符替换为A 0x41
char aa[] = {'A','A','A','A','A','A'};
NSMutableData *md = [NSMutableData dataWithData:data];
int loc = 0;
while(loc < [md length]){
char buffer;
[md getBytes:&buffer range:NSMakeRange(loc, 1)];
//printf("%d", buffer&0x80);
if((buffer & 0x80) == 0){
loc++;
continue;
}else if((buffer & 0xE0) == 0xC0){
loc++;
[md getBytes:&buffer range:NSMakeRange(loc, 1)];
if((buffer & 0xC0) == 0x80){
loc++;
continue;
}
loc--;
//非法字符,将这1个字符替换为AA
[md replaceBytesInRange:NSMakeRange(loc , 1) withBytes:aa length:1];
loc++;
continue;
}else if((buffer & 0xF0) == 0xE0){
loc++;
[md getBytes:&buffer range:NSMakeRange(loc, 1)];
if((buffer & 0xC0) == 0x80){
loc++;
[md getBytes:&buffer range:NSMakeRange(loc, 1)];
if((buffer & 0xC0) == 0x80){
loc++;
continue;
}
loc--;
}
loc--;
//非法字符,将这个字符替换为A
[md replaceBytesInRange:NSMakeRange(loc , 1) withBytes:aa length:1];
loc++;
continue;
}else{
[md replaceBytesInRange:NSMakeRange(loc, 1) withBytes:aa length:1];
loc++;
continue;
}
}
//NSLog(@" new data =>%@", md);
str = [[[NSString alloc] initWithData:md encoding:NSUTF8StringEncoding] autorelease];
分享到:
相关推荐
@interface NSData (AESCrypt) - (NSData *)AES256EncryptWithKey:(NSString *)key; - (NSData *)AES256DecryptWithKey:(NSString *)key; + (NSData *)dataWithBase64EncodedString:(NSString *)string; - (id)...
@interface NSData (AESCrypt) - (NSData *)AES256EncryptWithKey:(NSString *)key; - (NSData *)AES256DecryptWithKey:(NSString *)key; + (NSData *)dataWithBase64EncodedString:(NSString *)string; - (id)...
一行代码搞定NSString和NSData的md5加密
在上面的代码中,我们首先创建了一个NSString对象`fname`,然后使用`UTF8String`方法将其转化为char,并将结果存储在`fnameStr`数组中。 char 转化为 NSData 有时我们需要将char转化为NSData,以便在网络传输或...
在解析xib文件的时候发现有的节点内容的编码是 base64-UTF8,其实这个节点内容的编码顺序是先将NSString转化为utf8格式的NSData,再将NSData通过base64加密。刚拿到这样的字符串的时候感觉有点绕,但是仔细分析下来...
NSData+加密 NSData+Crypto是一个 Mac 和 iOS 的NSData和NSString包装器,用于 CommonCrypto 框架的摘要方法。 包装了以下摘要函数: MD2 MD4 MD5 沙1 sha224 sha256 sha384 sha512 所有摘要函数都可用于...
NSData在IOS开发中是一个神奇的数据类型。比如说NSData可以与NSImage类型转换等等。NSData与JSON数据类型转换也是目前常用的热点。本文章是在实践基础上,给出示例代码来说明如何使用NSData,以及NSData与JSON,还有...
iOS NSData 详细使用说明文档。
NSData+Base64类。提供两个方法。1. + (NSData *)dataFromBase64String:(NSString *)aString; 2. - (NSString *)base64EncodedString;
用于在 iOS 中处理WebP图像文件的UIImage类别。 安装 将Classes文件夹和WebP.framework到您的项目中。 用法 开始使用WebP-UIImage很简单。 导入框架#import "UIImage+WebP.h"并调用以下方法: - ( NSData *)...
NSData通用加解密算法扩展。Created by Jim Dovey on 31/8/2008.
ios demo,NSData和NSDictionary之间的相互转换的实现案例。
IOS应用源码——NSData.rar
在Mac OS X和iOS上用于Objective-C的Base64附加项 警告:不再需要此代码,macOS,iOS,iPadOS,watchOS和tvOS的所有最新版本均随附base64。 以下性能指标可用于与2012年提供的库... 在要使用Base64编码/解码的文件中,
安装NSData + TDTImageMIMEDetection可通过,要安装它,只需添加到Podfile中: pod 'NSData+TDTImageMIMEDetection'然后运行: $ pod install或者,将NSData+TDTImageMIMEDetection/子目录中的所有源文件导入到您的...
[xmlString appendString:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"]; [self getNodeStr:self string:xmlString]; return xmlString; } -(void)getNodeStr:(XmlNode *)node string:(NSMutableString *)str...
NSData 与 NSString,Byte数组,UIImage 的相互转换
个人总结,仅供参考;废话一句,全为二十。
SwiftWebSocket通过了521条高速公路的模糊测试,包括严格的UTF-8和消息压缩。Project Status 我正在寻找可以帮助或接管该项目维护的人员。特征高性能。 100%符合。 包括基准,极限,压缩等。。 TLS / WSS支持。 自...
ios demo,NSData和NSString之间的相互转换的源代码。