- 博客(48)
- 收藏
- 关注
原创 高德AMAP SDK使用
高德AMAP SDK使用本来以为能能接一个地图类的火,结果对方只与公司合作,把前期过程放这做个记录吧Androidsudio 加入AMAP SDKhttp://lbs.amap.com/api/android-sdk/guide/create-project/android-studio-create-project效果图源码public class MapA...
2018-06-17 22:19:26 1178
原创 Python入门笔记
Python入门笔记视频学习网址http://blog.fishc.com/category/python目录Python入门笔记目录语法数据转换获取变量类型操作符及优先级if elsefor 循环数组初始化方法操作符元组tuple字符串字符串格式化输出函数定义形式全局变量与局部变量内嵌函数闭包写法字典dict集合set类算数运算GUItkinter
2017-04-22 22:12:49 1030
原创 Android wpa_supplicant源码分析–连接AP过程
连接网络过程STA连接AP的过程可以参考该文章,http://support.huawei.com/ecommunity/bbs/10232527.htmlSTA需要认证后才可以接入AP,认证过程分为链路认证(associate)和接入认证(authentication),根据AP的加密方式 associate 和 authentication采用的认证方式不同。 上述网页中列出了各种加密方式的认
2016-06-24 19:34:38 11097 6
原创 Android wpa_supplicant源码分析–扫描scan过程
1 扫描过程一个完整的扫描过程 下发命令–>wpa_s构建扫描参数–>驱动扫描–>wpa_s接收到驱动的扫描结果接收到framework/wpa_cli下发的SCAN命令if (os_strncmp(buf, "SCAN ", 5) == 0) { wpas_ctrl_scan(wpa_s, buf + 5, reply, reply_size, &reply_len);1.1 wp
2016-06-14 17:05:27 8570 1
原创 Android wpa_supplicant源码分析---nl80211内核通信Generic Netlink
代码位置: kernel/net/netlink/genetlink.c kernel/include/net/genetlink.hGENL简介netlink仅支持32种协议类型,这在实际应用中可能并不足够。因此产生了generic netlink(以下简称为genl)。 generic netlink支持1023(前10个保留不用)个子协议号,弥补了netlink协议类型较少的缺陷。1 架
2016-06-07 11:09:27 9637
原创 Android wpa_supplicant源码分析---内核通信Netlink简介
本篇文章侧重剖析wpa_supplicant与内核的通信机制linux nl80211与用户空间采用Generic Netlink机制通信,Generic Netlink在netlink删扩展而来,而netlink是基于socekt通信
2016-06-06 18:25:06 3723 7
原创 Android wpa_supplicant源码分析--运行方式
1 wpa_supplicant的运行方式wpa_supplicant采用单线程运行的方式,靠事件进行驱动运行,其核心模块eloop_data,其中包含几条链表,分别代表了不同的事件类型。 Wpa_s中的事件分为3类,socket,signal,timeout事件,分别挂载到eloop_data链表中,其中socket又详细的分为read,write,exception 3种sock table
2016-05-18 22:22:40 2954
原创 Android wpa_supplicant源码分析--bss扫描结果
手机扫描结果的获取有两种方式:被动和主动 1,AP隔固定时间会发送Beacon帧,Beacon帧中有AP的SSID BSSID等基本信息,手机接收到Beacon帧就认为搜索到该AP创建的网络 2,手机主动发出probe request帧,AP接收到probe request帧后会发送probe response帧,手机接收到response帧后,就认为扫描到该网络。
2016-05-17 22:00:49 5631 1
原创 Android wpa_supplicant源码分析--conf配置文件
conf文件作为wpa_supplicant的配置文件,一般叫做 wpa_supplicant.conf 。其中存储着wpa_supplicant的运行参数和以保存的网络列表。 conf文件的路径,通过启动wpa_supplicant时的 –c 参数传入,初始化过程中赋值到wpa_s->confname,然后将数据读入wpa_s->conf中。wpa_supplicant的所有参数
2016-05-16 22:10:50 14969 10
原创 Android wpa_supplicant源码分析--启动之网络接口初始化
1 wpa_supplicant结构体与网络接口在手机adb中运行 netcfg或者ifconfig可以看到相关的网络接口的ip,掩码,mac地址等信息 Wpa_supplicant为每个网络接口都分配了一个struct wpa_supplicant, 该结构体存储了一些必要信息例如 struct dl_list bss(扫描结果); struct wpa_config *conf(配置文件)等等
2016-05-15 22:21:00 8729
原创 Android wpa_supplicant源码分析--启动之全局初始化
1. wpa_supplicant简介wpa_supplicant是用来用来支持无线中各种加密方式的,包括WEP、WPA/WPA2和WAPI(中国特有)、EAP(8021x)。wpa_s通过socket与上层(framework)和底层(driver)通信,向上接收命令和传递当前状态,向下发送命令到驱动并接收驱动上传的各种event,严格来讲wap_s和driver中还有一层cfg80211,cfg
2016-05-09 23:21:08 7860
原创 read与write方法
在read与write函数中,由于需要在内核空间和用户空间的内存交换数据,需要借助copy_to_user()与copy_from_user()方法,这是因为,用户空间的地址有可能指向的位置非内存的位置(当内存空间不足时),这时候内核中直接访问该地址会出错copy_to_user()就是先将不可访问的地址变成可访问的#include /*它定义了模块的 API、类型和宏(MOD
2014-12-24 21:43:33 2331
原创 主设备号--驱动模块与设备节点联系的纽带
一、如何对设备操作linux中对设备进行操作是通过文件的方式进行的,包括open、read、write。对于设备文件,一般称其为设备节点,节点有一个属性是设备号(主设备号、次设备号),其中主设备号将设备文件与驱动模块对应起来当我们open一个设备节点时,告诉了kernel要操作的是是主设备号为XX的节点,然后kernel会通过过XX来寻找合适的内存模块,进而调用内存模块
2014-12-21 22:49:52 3416
原创 linux模块基础
想要学习linux驱动,首先要知道,linux对文件的操作方式(read、write、ioctl),模块的相关知识(ko的编译和安装),内核空间与用户空间内存一、模块的编写在linux中模块的编写需要符合一定的规范,ko安装后会一直存在于内核中,直到被卸载在安装时,需要对模块的资源进行初始化,如内存分配、gpio的申请等,一般都会
2014-12-21 14:18:32 822
转载 百度最新面试题集锦
转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/73489681、实现一个函数,对一个正整数n,算得到1需要的最少操作次数。操作规则为:如果n为偶数,将其除以2;如果n为奇数,可以加1或减1;一直处理下去。例子:func(7) = 4,可以证明最少需要4次运算n = 7n-1 6n/2 3n
2013-09-08 22:35:24 668
转载 阿里云2011.9.17招聘会笔试题
1、 堆和栈的区别?答:1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、栈是向下增长的,堆是向上增长的。(可以参考
2013-09-08 22:34:17 863
转载 百度笔试题:malloc/free与new/delete的区别
转自 http://blog.csdn.net/hackbuteer1/article/details/6789164相同点:都可用于申请动态内存和释放内存不同点:(1)操作对象有所不同。malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符。对于非内部数据类的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自
2013-09-08 22:33:03 764
转载 笔试题目---描述在浏览器中敲入一个网址并按下回车后所发生的事情
转自http://blog.csdn.net/hackbuteer1/article/details/11263443答:浏览器输入网址之后,首先步骤1:需要查找域名的IP地址,DNS查找过程如下:(1)浏览器缓存 – 浏览器会缓存DNS记录一段时间。 有趣的是,操作系统没有告诉浏览器储存DNS记录的时间,这样不同浏览器会储存个自固定的一个时间(2分钟到30分钟不等)。(2)系统缓
2013-09-08 22:23:25 1485
原创 C语言中 sizeof 与 struct
C语言中,struct是由不同类型的变量组成的。当struct在内存存储时,是按照内存对齐来存放的,即开始和结束的地址都是n的倍数,这个n是由struct最长的变量类型决定的。也就是struct的大小一定是n的整数倍。例如一个struct含有double型,那么 n 就是8字节。还有一个要满足的条件,每一种变量的存放的首地址也要是其自身大小的倍数。下面简单起见,空字
2013-09-05 22:04:56 1082
原创 剑指offer--算法(7、14、16、21、25、28、59、37、43、51、46、58)
offer7 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。可以采用一个栈实现,单词和空格分开处理,但是太麻烦了。下面是博主的思路由于本题需要翻转句子,我们先颠倒句子中的所有字符。这时,不但翻转了句子中单
2013-09-03 22:14:49 1169
原创 剑指offer--发散思维(23、31、33、40、41、42、47、49、55)
offer23 一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法,并分析算法的时间复杂度。遇到不会的题目可以想想递归,假设 f(n),表示n级台阶的跳法,那么最后一跳只有两种可能,跳了1级或者跳了2级,即f(n)=f(n-1)+f(n-2),递归公式和非博纳契数列是一样的 / 1 n=1f
2013-09-03 20:58:40 1022
原创 剑指offer--位运算(22、34、63)
offer22 输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。典型的位运算题目void bit_find(const int& num,int* bit_array){ int i,mask; mask=1; for(i=31;i>=0;i--){ bit_array[i]=(bool)(num&mask);
2013-09-03 17:24:27 880
原创 剑指offer--细节(17、38、44)
offer17 输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。需要考虑到为负数,字符串中出现其他的非数字字符,数值溢出等情况。bool str_to_int(const char *a,int &n){ if(a==NULL){ printf("error,input is empty!\n"); return false;
2013-09-03 17:09:53 683
原创 剑指offer--简易哈希表(13、36、57)
offer13在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。可以采用256的一个数组存储字符出现的次数,因为只有256个字符。先遍历一遍字符串更新数组信息,然后再从头遍历字符串,找到数组中值为1的第一个字符即可。char find(char *a){ int n=strlen(a); int sign[256]={0}; int i; for(
2013-09-03 16:55:37 899
原创 剑指offer--快速排序变形(5、29)
offer5 题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。题目可以利用快速排序第一步来做,先选取首位的值,将小于该值的放在左边,大于等于该值的放在右边,如果该值的位置正好是k,那么该值连同左边的值就是最小的k个,如果位置小于k,那么在右边继续执行,如果大于k,那么在左边继续执行,时间复杂度平均是O(
2013-09-03 16:34:42 1686
原创 剑指offer--简易动态规划(3、10、20、26,61)
动态规划的思想是在前一步的信息已经保存好,下一步在之前保存信息的基础上做下一步计算。offer3 题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。假设之前的子数组已经得出最大和,当子数组长度向右延长1位时,子树组所有值加上延长的1位,如果和为负数,那么加上后面的连续值肯
2013-09-03 16:17:17 1202
原创 剑指offer--数据结构之二叉树(1、4、6、11、12、27、48、50、60)
offer1 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。二元查找树的中序遍历就是已经排序的序列,改成双向链表,可考虑,先把左子树改造成双向链表,保存好最后一个指针,然后将链表最后节点后驱指向跟节点,则根节点加入双向链表,然后在将右子树改造成双向链表。和中序遍历不同的是,需要一个指针保存双向链表的最后一个节点。代码:void
2013-09-03 12:59:30 1132
原创 剑指offer--数据结构之链表(9、19、35)
offer9 输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。可以先设置一个指针 p1,在链表中前进k步,然后加入新的指针 p2,和 p1同步遍历,直到 p1到尾部,那么 p2就是倒数第k个结点。需要注意两个地方,当链表长度不足k时,和倒数是从0开始的。代码:链表附带头节点。Node* FindKthTotail(Node* pHead, int
2013-09-03 11:18:11 967
原创 程序员面试,写代码要点
代码编写规范。声明指针时,若没有给他赋值,一定要赋值NULL。写函数后,第一条语句就要对输入是否合法做判断,指针、变量大小等等。要紧凑,可以适当将较短的赋值、小的语句块放在同一行。不同功能尽量封装成一个函数。添加注释采用骆驼命名法,变量第一个单词首字母小写,其余首字母大写,函数和全局变量所有单词首字母大写。程序中尽量少出现数字。对于需要返回值的函数,可将函数类型声明为bool类型,需要
2013-09-02 20:30:54 1357
原创 6种排序的时间测试代码
double* CreatArray(int len) //创建长度为len的随机数组{ int i; double* p=(double*)malloc(sizeof(double)*len); srand(time(0)); for (i=0;i<len;i++) { p[i]=1000.0*rand()/(RAND_MAX+1.0); } return p;}v
2013-08-20 22:32:21 1579
原创 数据结构之排序算法之O(nlogn)
上一次写了冒泡,选择,和插入排序。这一次写一下堆排序、归并、快速排序。堆排序堆排序,主要是利用完全二叉树在数组中的存储方式(层序遍历),i 位置的节点的儿子是 2i 和 2i+1 。最大堆的定义是,每个结点的值都比他的儿子大的一颗完全二叉树。那么我们排序的过程就是:首先将数组中的元素构建成一个最大堆然后将堆顶(根节点)的值拿出来,和最后一个元素交换,这样最大的数就在最后
2013-08-20 22:28:30 1087
转载 C,C++中表达式求值顺序,特别是左右++的问题 裘老的解释.
裘宗燕:C/C++ 语言中的表达式求值经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?”m = 1; n = m+++m++;最近有位不相识的朋友发email给我,问为什么在某个C++系统里,下面表达式打印出两个4,而不是4和5:a = 4; cout C++ 不是规定 要弄清这些,需要理解的一个问题是:如果程序里某处修改了一个变量(通过赋值、增量
2013-08-20 17:06:34 1297
原创 数据结构之排序算法之O(n^2)
在数据结构中讲解了7中排序算法,冒泡、选择、插入、希尔、堆排序、归并、快速排序。希尔排序感觉有点神,还没搞明白,以后再说。本篇讲述冒泡、选择、插入这3种时间复杂度O(n^2)的算法冒泡排序冒泡排序非常简单,但是如果正常写的话还是有优化的余地的,一般我们写的代码为:void BubbleSort_1(double *a,int low,int high){ if (!a||h
2013-08-20 16:03:18 912
原创 最小生成树之kruskal
这个算法非常简单,是基于边的从权值最小的边开始,依次加入到最小树中,如果当前边会和之前的边构成环路,那么不加入当前边,进行下一个边的加入,直到所有边都检测一遍。检测环路可以用一个顶点数组来标记,每加入一条边,就把顶点标记为1,如果当前边的两个顶点都已经被标记为1,那么表明这条边会和之前的边构成环路。这个具体的证明还没有搞明白,代码就不写了,非常简单。
2013-08-20 11:06:43 716
原创 图的深度优先遍历和广度优先遍历
首先这里的操作都是基于邻接矩阵的。深度优先遍历的过程是首先从一个顶点V开始,输出当前的顶点。从当前顶点的一个邻接顶点开始,继续深度优先遍历。当然要排除掉已经遍历过的点。当前顶点的邻接顶点前全部遍历一遍void DfsMgraph(const Mgraph* G,int i,bool * const visited){ visited[i]=true; printf("%2c"
2013-08-18 22:37:53 861
原创 二叉排序树--查询--插入--删除操作
首先是二叉排序树的概念:二叉排序树是一个二叉树,对每一个节点来说,右子树上的值都比根节点大,左子树上的值都比根节点小。那么在查询某个值key时,就需要遵循以下的步骤首先和当前节点的值比较,相等则退出,当前节点的地址就是要查询的地址。key比当前节点值小,那么key如果存在的话一定在当前节点的左子树中,继续查询左子树。key比当前节点值大,那么key如果存在的话一定在当前节点的右
2013-08-18 22:06:38 848
原创 最短路径之Dijkstra
这个的思想和prim的思想很像。首先假设已经找到k个顶点据入口距离最短的路径,剩余(n-k)个顶点距离入口的最短距离也知道。再寻找下一个加入路径的顶点时,首先寻找剩余(n-k)个顶点距离最短的顶点,加入路径。加入路径后需要更新剩余(n-k-1)个顶点距离入口的最短距离。由于新加入了第m=K+1个顶点,对于剩余的任意一个顶点Vi,只要比较Vi不经过Vm到入口的距离和经过Vm到入口的距离,如果
2013-08-16 17:06:45 680
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人