Skip to content
This repository was archived by the owner on Jan 12, 2024. It is now read-only.

fix: 适配M1 12.6 (21G115) 版本转码结果nil问题 #358

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 84 additions & 2 deletions V2RayX/ConfigImporter.m
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,96 @@ + (NSString* _Nonnull)decodeBase64String:(NSString*)encoded {
}
@try {
NSData* decodedData = [[NSData alloc] initWithBase64EncodedString:fixed options:NSDataBase64DecodingIgnoreUnknownCharacters];
NSString* decodedString = [[NSString alloc] initWithData:decodedData encoding:NSUTF8StringEncoding];
// M1 12.6 (21G115) 版本转码结果nil 增加过滤
NSData* resultDate = [[[ConfigImporter alloc]init] replaceNoUtf8:decodedData];
NSString* decodedString = [[NSString alloc] initWithData:resultDate encoding:NSUTF8StringEncoding];
assert(decodedString != nil);
return decodedString;
} @catch (NSException *exception) {
return @"";
}
}

//替换非utf8字符
//注意:如果是三字节utf-8,第二字节错误,则先替换第一字节内容(认为此字节误码为三字节utf8的头),然后判断剩下的两个字节是否非法;
- (NSData *)replaceNoUtf8:(NSData *)data
{
char aa[] = {'A','A','A','A','A','A'}; //utf8最多6个字符,当前方法未使用
NSMutableData *md = [NSMutableData dataWithData:data];
int loc = 0;
while (loc < [md length])
{
char buffer;
[md getBytes:&buffer range:NSMakeRange(loc, 1)];
if ((buffer & 0x80) == 0) //0xxx xxxx 1个Byte
{
loc++;
continue;
}
else if ((buffer & 0xE0) == 0xC0) //110x xxxx 2个Byte
{
loc++; //此处可能越界,要判断
if (loc >= md.length) { //此时的buffer已经是最后一个Byte
loc--;
//非法字符,将这个字符(一个byte)替换为A
[md replaceBytesInRange:NSMakeRange(loc, 1) withBytes:aa length:1];
break;
}
[md getBytes:&buffer range:NSMakeRange(loc, 1)];
if ((buffer & 0xC0) == 0x80) //10xx xxxx 第2个Byte
{
loc++;
continue;
}
loc--;
//非法字符,将这个字符(一个byte)替换为A
[md replaceBytesInRange:NSMakeRange(loc, 1) withBytes:aa length:1];
loc++;
continue;
}
else if ((buffer & 0xF0) == 0xE0) //1110 xxxx 3个Byte
{
loc++; //此处可能越界,要判断
if (loc >= md.length) { //此时的buffer已经是最后一个Byte
loc--;
//非法字符,将这个字符(一个byte)替换为A
[md replaceBytesInRange:NSMakeRange(loc, 1) withBytes:aa length:1];
break;
}
[md getBytes:&buffer range:NSMakeRange(loc, 1)];
if ((buffer & 0xC0) == 0x80) //10xx xxxx 第2个Byte
{
loc++; //此处可能越界,要判断
if (loc >= md.length) { //此时的buffer已经是最后一个Byte
loc--;
//非法字符,将这个字符(一个byte)替换为A
[md replaceBytesInRange:NSMakeRange(loc, 1) withBytes:aa length:1];
break;
}
[md getBytes:&buffer range:NSMakeRange(loc, 1)];
if ((buffer & 0xC0) == 0x80) //10xx xxxx 第3个Byte
{
loc++;
continue;
}
loc--;
}
loc--;
//非法字符,将这个字符(一个byte)替换为A
[md replaceBytesInRange:NSMakeRange(loc, 1) withBytes:aa length:1];
loc++;
continue;
}
else
{
//非法字符,将这个字符(一个byte)替换为A
[md replaceBytesInRange:NSMakeRange(loc, 1) withBytes:aa length:1];
loc++;
continue;
}
}

return md;
}
+ (NSDictionary*)parseLegacySSLink:(NSString*)link {
//http://shadowsocks.org/en/config/quick-guide.html
@try {
Expand Down