Dart语言中utf8.encode(string);是将string编码成无符号bytes,那么对应在OC中将拆分成几部分
001 将字符串通过NSUTF8StringEncoding编码转化成NSData
NSString* utf8EncodingStr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSData *testData = [utf8EncodingStr dataUsingEncoding: NSUTF8StringEncoding];//字符串转化成 data
002 将NSData 转化成Byte
Byte*testByte = (Byte*)[testData bytes];
003 将Byte 转化成uint8_t*bytes 查看源码
uint8_t*bytes =malloc(sizeof(*bytes)*testData.length);
#ifndef _UINT8_T
#define _UINT8_T
typedef unsigned char uint8_t;
#endif /* _UINT8_T */
Dart 中UTF8解码
List<int> cipherTextList = new List<int>.from(cipherText);
var result = utf8.decode(cipherTextList);
004 UTF8解码
NSData*adata = [[NSData alloc]initWithBytes:bytes length:testData.length];
NSString *result =[[ NSString alloc] initWithData:adata encoding:NSUTF8StringEncoding];
这样做的好处就是可以将中文字符也一并处理 在经过解密算法后得到的bytes 可以解析成正确的字符。
如果是将NSString中每个字符进行处理这里每个字符都是char带有符号的,那么中文编解码就会显现乱码。
底层字符原理:
在内存中char与unsigned char 都是一个字节,8比特,不同的是两者的最高位,char的范围是-128-127,unsigned char的取值范围是0-255,
在表示byte是都是用unsigned char,是因为将byte的值赋值给int long 等数据类型时,如果是char系统会进行高位扩展,而unsigned char 不会。
个人感受这是计算机基础的知识,基础不扎实,就会有技术认知偏差