图片 1腾讯.jpg图片 2前言.png

楼主项目中需要有一个轮播图,因为比较简单,就自己写了个,因为是从网上弄得图片
所以用了SDWebImage 这个三方库 当然自己也可以去掉

抓包分析数据在移动开发中十分重要,可以帮助我们更快的了解数据构成,提高开发效率。但是在苹果要求上线的App必须使用HTTS之后,HTTPS数据包的抓取分析较为麻烦,在此总结了在mac上使用Charles抓包的详细步骤。

本来这篇文章打算在上一篇文章后一个星期就写完的,可是最近跟一个同学在讨论创业的事情,因此迟迟还没写完,拖到现在(2017年2月14日01:25:22),因此今晚必需赶出来。

13、浏览器访问某页面,HTTP 协议返回状态码为 403 时表示:

A. 找不到该页面B. 禁止访问C. 内部服务器访问D. 服务器繁忙

类型后面有*号 如用使用 请自行加上。。。。。

首先我们下载最先版本的Charles官网下载:

这题直接给答案了,因为这是很基础的题目,无论是什么开发,都离不开网络了,而网络开发的核心就是
HTTP 协议,因此这是很基础的题目,在之前的文章中也有介绍过Android
网络框架_网络框架的核心Http协议,最后这题的答案选择为:B

代码:。h 文件

安装Charles之后,我们选择Proxy->Start
Recording,开始记录网络请求,然后勾选MacOS
Proxy(和其他的代理对象如:Mozilla Firefox
Proxy火狐浏览器),将系统代理设置通过Charles Proxy。

14、如果某系统 15*4=112 成立,则系统采用的是进制。

A.6B.7C.8D.9

@protocol TJXViewDelegate<NSObject>//判断点击的那个-sendImageName:(TJXView *)TJXView andName:(NSInteger)selectImage;@end@interface TJXView : UIView@property (nonatomic,weak)id<TJXViewDelegate>delegate;//传一个frame 和 装有图片名字的数组过来//参数一:frame//参数二:装有图片名字的数组//参数三:BOOL如果是YES,那么自动滚动,如果是NO不滚动-initWithFrame:frame andImageNameArray:(NSMutableArray * )imageNameArray andIsRunning:isRunning;@end.m文件@interface TJXView()<UIScrollViewDelegate>{ NSInteger _currentPage; //记录真实的页码数 NSTimer *_timer; //生命一个全局变量}@property (nonatomic,assign) BOOL isRun;@property (nonatomic,strong) NSMutableArray *imageArray;//存储图片的名字@property (nonatomic,strong) UIScrollView *scrollView;@property (nonatomic,strong) UIPageControl *pageControl;@property (nonatomic,assign) CGFloat width;//view的宽@property (nonatomic,assign) CGFloat height;//view的高@end、、、-initWithFrame:frame andImageNameArray:(NSMutableArray *)imageNameArray andIsRunning:isRunning{ self = [super initWithFrame:frame]; if  { _width = self.frame.size.width; _height = self.frame.size.height; //arrayWithArray 把数组中的内容放到一个数组中返回 self.imageArray = [NSMutableArray arrayWithArray:imageNameArray]; //在数组的尾部添加原数组第一个元素 [self.imageArray addObject:[imageNameArray firstObject]]; //在数组的首部添加原数组最后一个元素 [self.imageArray insertObject:[imageNameArray lastObject] atIndex:0]; self.isRun = isRunning; _currentPage = 0; [self createSro]; [self createPageControl]; [self createTimer]; } return self;}、、、-createTimer{ if (_isRun == YES) { _timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector userInfo:nil repeats:YES ]; [[NSRunLoop currentRunLoop]addTimer:_timer forMode:NSRunLoopCommonModes]; }}-change{ //1获得当前的点 CGPoint point = _scrollView.contentOffset; //2求得将要变换的点 CGPoint endPoint = CGPointMake(point.x+_width, 0); //判断 if (endPoint.x == (self.imageArray.count-1)*_width) { [UIView animateWithDuration:0.25 animations:^{ _scrollView.contentOffset = CGPointMake(endPoint.x, 0); } completion:^(BOOL finished) { //动画完成的block _scrollView.contentOffset = CGPointMake(_width, 0); CGPoint realEnd = _scrollView.contentOffset; //取一遍页码数 _currentPage = realEnd.x/_width; _pageControl.currentPage = _currentPage-1; }]; } else{ //0.25s中更改一个图片 [UIView animateWithDuration:0.25 animations:^{ _scrollView.contentOffset = endPoint; } completion:^(BOOL finished) { }]; CGPoint realEnd = _scrollView.contentOffset; //取一遍页码数 _currentPage = realEnd.x/_width; _pageControl.currentPage = _currentPage-1; } }//创建页码指示器-createPageControl{ _pageControl = [[UIPageControl alloc]initWithFrame:CGRectMake(_width-200, _height-30, 100, 30)]; _pageControl.centerX = _width/2; _pageControl.numberOfPages = self.imageArray.count-2; _pageControl.pageIndicatorTintColor = WP_GRAY_COLOR; _pageControl.currentPageIndicatorTintColor = [UIColor whiteColor]; _pageControl.userInteractionEnabled = NO; [self addSubview:_pageControl];}//创建滚动视图-createSro{ _scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, _width, _height)]; _scrollView.contentSize = CGSizeMake(_width*self.imageArray.count, _height); for (int i = 0; i < self.imageArray.count; i++) { UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(i*_width, 0, _width, _height)];// imageView.image = [UIImage imageNamed:self.imageArray[i]]; [imageView sd_setImageWithURL:self.imageArray[i] placeholderImage:[UIImage imageNamed:@"home_banner_blank"]]; imageView.userInteractionEnabled = YES; imageView.tag = 200+i; UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector]; [imageView addGestureRecognizer:tap]; [_scrollView addSubview:imageView]; } //水平指示条不显示 _scrollView.showsHorizontalScrollIndicator = NO; //关闭弹簧效果 _scrollView.bounces = NO; //设置用户看到第一张 _scrollView.contentOffset = CGPointMake(_width, 0); //设置代理 _scrollView.delegate = self; //分页效果 _scrollView.pagingEnabled = YES; [self addSubview:_scrollView];}-tap:(UITapGestureRecognizer *)tap{ if(_delegate&&[_delegate respondsToSelector:@selector(sendImageName:andName:)]){ [_delegate sendImageName:self andName:tap.view.tag-201]; }else{ NSLog(@"没有设置代理或者没有事先协议的方法"); } }#pragma mark UIScrollViewDelegate//停止滚动-scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ if  { [_timer setFireDate:[NSDate dateWithTimeIntervalSinceNow:2]]; } //图片的个数 1 2 3 4 5 6 7 8 //真实的页码 0 1 2 3 4 5 6 7 //显示的页码 0 1 2 3 4 5 CGPoint point = _scrollView.contentOffset; if (point.x == (self.imageArray.count-1)*_width) { scrollView.contentOffset = CGPointMake(_width, 0); } if (point.x == 0) { scrollView.contentOffset = CGPointMake((self.imageArray.count-2)*_width, 0); } //取一遍页码数 CGPoint endPoint = scrollView.contentOffset; _currentPage = endPoint.x/_width; _pageControl.currentPage = _currentPage-1;}//手指开始触摸的时候,停止计时器-scrollViewWillBeginDragging:(UIScrollView *)scrollView{ if  { //如果有,停掉 [_timer setFireDate:[NSDate distantFuture]]; }}在项目中 导入头文件 遵守代理 TJXView * TJXView = [[TJXView alloc]initWithFrame:CGRectMake(0, 0, WPSCREEN_WIDTH, 100*WPSCREEN_HIGTH_RATIO) andImageNameArray:self.bannerImager andIsRunning:YES]; TJXView.delegate = self; [self.view addSubview: TJXView];#pragma mark TJXViewDelegate-sendImageName:(TJXView *) TJXView andName:(NSInteger)selectImage{ KKLog(@"%ld",selectImage);}

图片 3这里写图片描述

这题因为是选择题,我们可以直接从 A 的选项开始,假设是 6
进制的,我们把等式 15 * 4 = 112 转为十进制,就是 11 * 4 =
44,最后验证等式是否成立,明显等式是成立的,因此答案已经出来了,选择 A

此时打开系统偏好设置->网络->高级,我们可以看到本机HTTP和HTTPS请求被代理到127.0.0.1,端口号是8888。至此,我们已经完成了基本的网路请求设置,通过此Mac发起的HTTP请求,我们都可以通过Charles分析。

当然我们也可以假设是 X 进制,且我们知道 X 大于 5, 则:4 = xx +x
+2,所以最后计算的结果也为 6

图片 4这里写图片描述

15、某段文本中各个字母出现的频率分别是{a:4,b:3,o:12,h:7,i:10},使用哈夫曼编码,则哪种是可能的编码:<pre>A.
a b h oB. a b h oC. a b h oD. a b h o

注:在Charles关闭的时候,这里的web代理和安全web代理也会变成无勾选状态。保证无代理时,Mac也能够访问网络。

知识点

  1. 为了使用Charles抓取到iPhone设备的数据包,我们首先要打开Charles的代理功能。选择Proxy
    ->Proxy Setting,设置Port:8888,选择Enable TransParent HTTP
    Proxying。

关于哈夫曼树的知识点很容易遗忘,因为对于我来说,用的还是比较少的,甚至说接触的也比较少。但是一些注意的知识点还是要记住的。

图片 5这里写图片描述

关于哈夫曼树的注意点:

  1. 接下来我们要将手机的网络代理IP设置为Charles运行所在的电脑IP,获取本机电脑的IP方法如下:方法一:Mac电脑上使用Control
    +空格键,并输入Terminal 可以进入控制台,然后键入 ifconfig en0命令
    ,我们查看到当前电脑的IP地址。

1、满二叉树不一定是哈夫曼树

图片 6这里写图片描述

2、哈夫曼树中权越大的叶子离根越近 (很好理解,WPL最小的二叉树)

方法二:通过Charles查看本机的IP地址:打开Charles ->Help->Local IP
Address

3、具有相同带权结点的哈夫曼树不惟一

图片 7这里写图片描述

4、哈夫曼树的结点的度数为 0 或 2, 没有度为 1 的结点。

  1. 设置手机网络代理IP我们依次打开iphone
    “设置->无线局域网”,点击当前连接Wifi右侧的详情按钮。这里显示了当前连接Wifi的基本信息,我们需要将这里底部的HTTP代理改为手动,然后填上Charles运行所在电脑的IP和端口号8888。如图:

    图片 8这里写图片描述

5、包含 n 个叶子结点的哈夫曼树中共有 2n – 1 个结点。

此时,iPhone的网络代理就设置完成了,手机上请求将会被代理到mac上,我们可以很方便的通过Charles查看到手机应用发起的网络请求数据包。

6、包含 n 棵树的森林要经过 n–1 次合并才能形成哈夫曼树,共产生 n–1
个新结点

相对于HTTP类的网络请求,HTTPS请求更加安全,这也使得抓取这类的数据包进行分析要麻烦一些。抓取HTTPS请求数据包进行分析,关键的步骤如下:

哈夫曼树的应用很广,哈夫曼编码就是其在电讯通信中的应用之一。广泛地用于数据文件压缩的十分有效的编码方法。其压缩率通常在20%~90%之间。在电讯通信业务中,通常用二进制编码来表示字母或其他字符,并用这样的编码来表示字符序列。

  1. 安装Charles根证书打开charles,依次点击Help -> SSL Proxying ->
    Install Charles Root Certificate,安装根证书

例:如果需传送的电文为
‘ABACCDA’,它只用到四种字符,用两位二进制编码便可分辨。假设 A, B, C, D
的编码分别为 00, 01,10, 11,则上述电文便为
‘00010010101100’,译码员按两位进行分组译码,便可恢复原来的电文。

图片 9这里写图片描述

好了,了解了相关的知识点,我们开始解题,首先,创建一个哈夫曼树,原则如下:

  1. 设置证书信任在安装证书之后,我们查看钥匙串。选择所有项目,我们会看到一个带有红叉标记不被信任的Charles证书。Charles证书默认是不信任的,需要我们手动设置。右键->显示简介->点击信任,我们如图设置始终信任。
  1. 将每个英文字母依照出现频率由小排到大,最小在左,组成一个序列

  2. 每个字母都代表一个终端节点,比较每个字母的出现频率,将最小的两个字母频率相加合成一个新的节点,将两个字母从序列中删除,将生成的节点加入到字母队列中

图片 10这里写图片描述

  1. 设置 SSL 代理打开charles应用,选择Proxy->SSL Proxying
    Settings,我们在这里设置SSL Proxy,点击面板上的add,如下图:

发表评论

电子邮件地址不会被公开。 必填项已用*标注