XZ_iOS之网页去广告

// 方法一:
 - (void)showNews:(NSDictionary *)news
 {
 // 1.取出网页内容
 NSString *body = news[@"body"];
 
 // 2.取出图片
 NSDictionary *img = [news[@"img"] lastObject];
 NSString *imgHTML = [NSString stringWithFormat:@"<img src=\"%@\" width=\"300\" height=\"171\">", img[@"src"]];
 
 // 2.创建一个webView,显示网页
 UIWebView *webView = [[UIWebView alloc] init];
 webView.frame = self.view.bounds;
 [self.view addSubview:webView];
 
 // 3.拼接网页内容
 NSString *html = [body stringByReplacingOccurrencesOfString:img[@"ref"] withString:imgHTML];
 
 // 4.取出新闻标题
 NSString *title = news[@"title"];
 // 5.取出新闻的时间
 NSString *time = news[@"ptime"];
 
 // 头部内容
 NSString *header = [NSString stringWithFormat:@"<div class=\"title\">%@</div><div class=\"time\">%@</div>", title, time];
 html = [NSString stringWithFormat:@"%@%@", header, html];
 
 // 链接mainBundle中的CSS文件
 NSURL *cssURL = [[NSBundle mainBundle] URLForResource:@"news" withExtension:@"css"];
 html = [NSString stringWithFormat:@"%@<link rel=\"stylesheet\" href=\"%@\">", html, cssURL];
 
 // 5.加载网页内容
 [webView loadHTMLString:html baseURL:nil];
 }
 
// 方法二:火狐浏览器:在要去掉的广告上,右键”查看元素“,将代码粘贴到要替换的字符串处
 NSString *url = @"http://ibaby.ipadown.com/api/food/food.show.detail.php?id=";
    NSString *webSite = [url stringByAppendingString:self.Idtext];
    NSURL *siteURL= [NSURL URLWithString:webSite];
    NSURLRequest *request = [NSURLRequest requestWithURL:siteURL];
    // 加载请求
//    [self.webView.web loadRequest:request];
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSURLSessionDataTask *dataTask = [[NSURLSession sharedSession]dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
 
            self.htmlAbosluteString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
            self.htmlAbosluteString = [self.htmlAbosluteString stringByReplacingOccurrencesOfString:@"<img width=\"0\" height=\"0\" style=\"width: 803px; height: 121px;\" src=\"http://ubmcmm.baidustatic.com/media/v1/0f0007y3CMO4YsUwoxXbB6.jpg\"></img>" withString:@""];
// 这是要去掉广告的第二个地方
self.htmlAbosluteString = [self.htmlAbosluteString stringByReplacingOccurrencesOfString:str9 withString:@""];
            dispatch_async(dispatch_get_main_queue(), ^{
                [self.webView.web loadHTMLString:self.htmlAbosluteString baseURL:nil];
            });
        }];
        [dataTask resume];
        CGRect tmpFrame = self.webView.web.frame;
        CGFloat h = self.navigationController.navigationBar.frame.size.height + 20;
        tmpFrame.origin.y -= h;
        self.webView.web.frame = tmpFrame;
    });
// 方法三:
 NSString *str = @".jpg\" height=\"200\" width=\"340\"/>";
- (NSString *)transformMessage:(NSString *)message withString:(NSString *)string
{
    NSString *messageCopy = message;
    NSScanner *theScanner;
    NSString *text = nil;
    theScanner = [NSScanner scannerWithString:messageCopy];
    while ([theScanner isAtEnd] == NO)
    {
         // find start of tag
        [theScanner scanUpToString:@".jpg" intoString:NULL] ;
         // find end of tag
        if ([theScanner scanUpToString:@">" intoString:&text] || [theScanner scanUpToString:@"/>" intoString:&text]) {
            // .jpg" height="200" width="340"/>
            // 如果不需要第二个参数 :
            // 可以将string替换为 [NSString stringWithFormat:@".jpg\" height=\\\"200\" width=\"340\"/>"]
            if (text != nil) {
                messageCopy = [messageCopy stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"%@>", text] withString:string];
                NSLog(@"%@",messageCopy);
                break;
            }
        }
    }
    return messageCopy;
}
作用是把start tag和end tag 之间替换成string的值
`xz_dec_run` 是 XZ 解压缩库中的一个关键函数,用于执行实际的解压缩操作。在某些情况下,调用 `xz_dec_run` 时可能会遇到错误,例如返回 `XZ_DATA_ERROR` 或 `XZ_BUF_ERROR`,这通常表示输入数据损坏、缓冲区不足或解压缩流程配置不当。这类问题在嵌入式系统中尤为关键,尤其是在使用 MTD(Memory Technology Device)设备时,如 NAND 或 NOR Flash 存储器,数据完整性问题可能导致解压缩失败 [^3]。 ### 常见问题与解决方法 #### 1. **输入数据损坏或不完整** 如果输入流在传输或存储过程中被损坏,`xz_dec_run` 会返回 `XZ_DATA_ERROR`。这通常发生在固件更新失败、文件系统损坏或存储介质错误的情况下。 **解决方法:** - 确保输入数据完整无损,可以通过校验和(如 CRC32)验证数据完整性。 - 在嵌入式系统中,启用 MTD 层的 ECC 校正功能,确保数据读取过程中能够自动修复位翻转问题 [^3]。 #### 2. **缓冲区大小不足** `xz_dec_run` 需要足够的输入和输出缓冲区来处理数据。如果缓冲区太小,可能导致 `XZ_BUF_ERROR`。 **解决方法:** - 确保输入缓冲区 (`in` 指针) 和输出缓冲区 (`out` 指针) 足够大,建议使用 4KB 或更大的缓冲区。 - 动态分配缓冲区以适应不同大小的数据块。 #### 3. **解压缩器未正确初始化** 调用 `xz_dec_run` 前必须正确调用 `xz_dec_init()` 初始化解压缩器。如果跳过此步骤或初始化失败,可能导致运行时错误。 **解决方法:** - 在调用 `xz_dec_run` 之前,确保 `xz_dec_init()` 成功执行。 - 检查返回值,如果初始化失败,应释放资源并返回错误码。 #### 4. **流式处理不当** `xz_dec_run` 支持流式解压缩,但如果未正确处理输入/输出指针和缓冲区状态,可能导致解压缩不完整或死循环。 **解决方法:** - 正确管理 `in_pos` 和 `out_pos` 指针,确保每次调用 `xz_dec_run` 时更新缓冲区偏移量。 - 在读取完所有输入数据后,检查是否所有输出数据都已处理完毕。 #### 5. **内存分配失败** `xz_dec_run` 可能依赖动态内存分配,如果内存不足,可能导致解压缩失败。 **解决方法:** - 使用自定义内存分配器(如 `ISzAlloc` 接口)来管理内存分配,确保在资源受限的环境中也能正常工作 [^2]。 - 在嵌入式系统中预留足够的内存用于解压缩操作。 ### 示例代码:使用 xz_dec_run 解压缩 ```c #include <stdio.h> #include <stdlib.h> #include "xz.h" #define BUF_SIZE 4096 int decompress_xz(const char *in_file, const char *out_file) { FILE *fin = fopen(in_file, "rb"); FILE *fout = fopen(out_file, "wb"); if (!fin || !fout) { return -1; } struct xz_dec *state; struct xz_buf buf; uint8_t in[BUF_SIZE]; uint8_t out[BUF_SIZE]; state = xz_dec_init(XZ_DYNALLOC, 0); if (!state) { fclose(fin); fclose(fout); return -1; } buf.in = in; buf.in_size = 0; buf.out = out; buf.out_size = BUF_SIZE; while (1) { size_t in_read = fread((void *)buf.in + buf.in_pos, 1, BUF_SIZE - buf.in_pos, fin); buf.in_size = buf.in_pos + in_read; enum xz_ret ret = xz_dec_run(state, &buf); fwrite(out, 1, buf.out_pos, fout); buf.out_pos = 0; if (ret == XZ_STREAM_END) { break; } else if (ret != XZ_OK) { xz_dec_end(state); fclose(fin); fclose(fout); return -1; } if (in_read == 0 && buf.in_pos == buf.in_size) { break; } } xz_dec_end(state); fclose(fin); fclose(fout); return 0; } ``` ### 调试建议 - 使用日志记录每次调用 `xz_dec_run` 的返回值和缓冲区状态,有助于定位问题。 - 在嵌入式设备中,可以尝试使用 `xz` 工具链在主机端验证压缩文件的完整性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值