weixin_38137714 2017-08-29 02:00
浏览 436

data utf8转成字符串,WiFi下没问题,流量的时候字符串会变成空,什么原因?

NSString *recvMessage = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; 转成字符串,WiFi下没问题,流量的时候字符串会变成空,什么原因?

然后找了一个替换非法字符的方法,在流量情况下,显示data里有非法字符,WiFi下没问题,什么原因?

  • (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
    NSLog(@"非法字符 %@",md);
    [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
    NSLog(@"非法字符 %@",md);
    [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
    NSLog(@"非法字符 %@",md);
    [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
    NSLog(@"非法字符 %@",md);
    [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
    NSLog(@"非法字符 %@",md);
    [md replaceBytesInRange:NSMakeRange(loc, 1) withBytes:aa length:1];
    loc++;
    continue;
    }
    else
    {
    //非法字符,将这个字符(一个byte)替换为A
    NSLog(@"非法字符 %@",md);
    [md replaceBytesInRange:NSMakeRange(loc, 1) withBytes:aa length:1];
    loc++;
    continue;
    }
    }

    return md;
    }

  • 写回答

0条回答

    报告相同问题?

    悬赏问题

    • ¥35 平滑拟合曲线该如何生成
    • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
    • ¥15 名为“Product”的列已属于此 DataTable
    • ¥15 安卓adb backup备份应用数据失败
    • ¥15 eclipse运行项目时遇到的问题
    • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
    • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
    • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
    • ¥50 成都蓉城足球俱乐部小程序抢票
    • ¥15 yolov7训练自己的数据集