退二进三(共12篇)
退二进三 篇1
为什么当前的计算机主要使用二进制处理信息呢?这个问题当然难不倒大家,因为电子元件处理二进制数据比较容易,“0”和“1”代表两个完全不一样的物理状态,存储和识别比较容易,转换起来方便快捷。虽然问题回答起来并不难,不过通过文字了解是一回事,亲身体验领悟又是另一回事, 由于在课堂上很难直观地观察到电子元件处理数据的过程,所以不妨通过游戏让学习者真切地体验到二进制的优势。
用Flappy Bird传输数据
提起FlappyBird很多人都知道, 网络上有不少网友自编的模仿Flappy Bird游戏的源代码,稍加改造就可以作为教学工具。限于篇幅这里不给出完整的代码,大家可自行上网搜索。
改造后的游戏是这样的:小鸟所通过的每列障碍由7个管子和1个空档组成,空档在哪里并不是随机的,如要传递八进制的数据“325”,就需要在第3个、第2个及第5个管子后开出空档,若小鸟顺利通过全部的三个空档而没有撞到管子,就表示顺利传递了“325”这个数据。只要是认真玩过FlappyBird的人,就知道完成这个任务是非常困难的(如图1)。
为了更方便地传递数据,可以把八进制的“325”转换成二进制“11010101”, 虽然“325”里只有3个符号,而“11010101” 里有8个符号,但因为物理状态只有两种,所以小鸟通过管道的腾挪空间可以大幅度增加。小鸟需要通过障碍的数量增加了,但游戏难度反而大大降低(如图2)。
通过这个游戏就可以看出,在有限的信息处理空间中,使用二进制有助于保证数据传输的稳定性。
用游戏棋做二进制运算
假设有3个二进制数,分别是“101” “1111”和“1001”,用棋子(或积木)代表1,空档代表0,将这3个二进制数分三行摆好(如图3)。
游戏规则非常简单:每个棋子都可以向上移动,一次只能移动一颗棋子,但不能往其他方向移;如棋子移动时遇到另一个棋子,则可以将阻挡它移动的棋子吃掉,吃掉阻挡物后,当前棋子再向左移动一格。当所有棋子处于同一行时,游戏结束(如图4)。
然后根据这个规则,对初始的图形进行变化,先移动哪个棋子后移动哪个棋子其实无所谓,最后结果总是一样的(如下页图5)。
在图5的例子中,最后的结果是“11101”,其实,把“101”“1111”和“1001”3个二进制 数加起来 ,得到的正 是“11101”。这个游戏说明,只要使用很简单的规则,就可以实现针对二进制数的数学运算。稍微改一下规则,还能做二进制减法,大家能想出做减法的规则应当如何制定吗?
退二进三 篇2
破口,兼顾各方利益,取得良好效果。
一、成立专门机构,加强指导服务**区城中村的普遍情况是:集体实力较弱,以前建立起的企业因为市场、人员、环境等不利因素很多处于停产、半停产状态;村民的主要经济来源是出租房屋和做些小生意的收入;居住环境脏、乱、差,村民强烈希望改变现状。
经过调研,**区确定把改造城中村、提高农民生活水平作为一项重要工作。调查中发现,城中村改造需要大批有经验、有信息的人员协助招商洽谈、提供相关政策、办理相关手续,为此,**区专门成立了招商局、城区改造办公室等机构,加强指导,协调市、区相关部门为城中村建设服务。实践证明,城中村改造不能放任自流,需要政府的引导和规划,尤其在城中村改造阶段,政府的引导和支持是非常必要的。政府既要针对项目提供跟踪服务,保证运作成功,又要搞好监督,避免盲目开发损害群众利益,防止产生社会不安定因素。
为保证城中村建设顺利开展,**区政府特别注重做好三方面的工作。一是充分论证,慎重决策。对拟建项目的市场定位、商业价值及发展前景进行充分论证,以此保证决策的准确性。二是确保项目的可操作性。项目既要符合规划、城建、环保等部门的规定,还要根据城中村的实际经济能力确定建设方式和规模,对采用合作开发建设方式的要明确各方法律责任。三是兼顾各方利益,以免产生社会不安定因素。在拆迁改造建筑密度大的村民住宅区时,区政府还减免收取土地收益金和有关配套费用,根据被拆迁村民的经济能力和故土观念确定安置房。这些措施的实施,有力地推动了城中村改造。
二、明确发展方向,实施“退二进三”战略近年来,为争创全国卫生城市、全国优秀旅游城市,**市、区两级政府不断加大投资力度,创造优良环境,改变城市面貌。道路、绿化等公共设施的建设需要占用城中村的土地,同时住房市场化改革使辖区内各单位职工对商品房的消费能力大增,房地产商看好城中村的地理位置,纷纷到**区投资,这无疑给**区城中村建设带来了机遇。
经过调查论证,**区对城中村的发展方向形成一致意见,即“退二(产业)进三(产业)”,保留少数经营状况好、有发展前途的工业企业,关停大部分村集体企业,大力发展以房地产为主的第三产业,壮大集体经济,改变落后的村容面貌,最终实现城乡一体化。
目前,各城中村因地制宜,利用各自或宜居或宜商的地理位置优势,改造建设全面展开,大批建设项目落户城中村。河南科技大学学生公寓、同乐建材市场、金梦家具市场、地久商务大厦等项目均已投入使用,并取得良好的经济和社会效益。在南村和兴隆寨两个村,建成了兴隆花园、兴隆新村、珠江路商业街、南华新村等本地有名的地产项目,不仅改变了以前脏、乱、差的旧农村形象,而且壮大了集体实力,村民住进了环境优美的新社区,享受到了城中村改造带来的许多福利。
三、完善基础设施,发挥城中村的区位优势**区大多数城中村位于城区繁华地带,部分位于城乡接合部,区位优势非常明显。但在城中村改造之前,区位优势还仅仅是潜在的,并没有发挥出来,因为大多数城中村基础设施不完善、自然环境差、社会治安混乱、没有吸引力。城中村改造的首要任务就是要完善基础设施、改善周边环境。
由于多数城中村集体经济实力较弱,而改造成本又较高,因此,**市及**区政府加大了对城中村改造的投资力度,对涉及水、电、道路、绿化等的公共基础设施建设给予了必要的财政支持。按照城市总体发展规划,**市先后实施了改造南昌路为观光示范路、新修建并绿化洛河、涧河河堤等工程,这些工程大大改善了沿线几个城中村的周围环境。
地处南昌路东侧、洛河北岸的兴隆寨抓住机遇,在以前无法利用的洛河滩上,高标准建设了占地500多亩的兴隆花园,因为该项目位于风景秀丽的洛河岸边,交通方便,配套设施齐全,一经推出便获得巨大成功。南村统一规划建设了新住宅区,彻底改变了村容村貌,改善了村民居住条件,提高了土地利用率。在修建位于兴隆寨的珠江南路之际,为最大限度提高路两侧土地的利用价值,该村接受了市旅游、规划等部门的意见,把此路打造成餐饮娱乐型商业街。经过两年建设,如今已达到预期效果。每到夜晚,这个投资2亿多元,长1.5公里的商业街流光溢彩,车水马龙,已成为**城的一个亮点。
工农乡的南村处于城乡结合部,几年前交通不便,自然环境又差,是有名的穷村。在城中村改造过
程中,南村改变思路,主动出击,筑巢引凤。南村把市里扩建武汉路、联盟路时支付的征地资金用于道路、电力、绿化等基础设施建设,以优惠条件吸引有关部门把机动车检测中心、多条线路公交车的终点站停车场等公共设施建在该村。完善的基础设施,令人赞叹的优美环境很快引来很多房地产投资,短短两三年时间,50多万平方米的商品房全部建成并销售一空,数万人在此安家。南村村民全部住进了统一规划建设的南华新村,享受村集体安排的多种福利。接着,南村又带动周边农村共同建设了南华工业园,南苑耐火材料有限公司、南华冶金厂、一拖标准零件有限公司等企业相继入园,还引来了外商投资开发、占地500亩的房地产项目——香港城。
夏进三战皆北 篇3
嘈杂的街道上,出租车飞驰而过,头上顶着红果乳业的顶灯;酒店里宾客满座,前厅悬挂着欢迎银桥乳业下榻的横幅;会展中心的入口处,是伊利的巨型展台,人声鼎沸。
夏进,却并未留下太多印记。尽管以此往南60公里,便是它的大本营吴忠市。
夏进似乎也在有意保持缄默,办公室负责人这样应付记者的采访要求:“我们早没总经理了……也没部门负责接待,没法安排和董事长见面……我什么也不知道。”
很难想象,这就是那家曾在全国各地三次掀起“夏进狂飙”的企业。
是真的偃旗息鼓马放南山还是卧薪尝胆图谋东山再起?
杀出
一切始于1992年,国内原奶收购量价齐跌。宁夏吴忠市绝望的奶农们爬上市政府大楼四层,将一盆盆原奶倾泻而下,宛如白色的泪瀑。
为消化奶农剩奶,靠着一个多亿人民币的银行贷款,1994年夏进建厂投产液态奶。彼时,今朝的乳业巨擘伊利刚刚完成股改,还是一家雪糕生产厂。
由于不懂乳业经营,加之政策性被动收奶,至1996年,夏进负债率已高达150%,拖欠员工工资与奶农奶款也有半年之久。
1996年9月,张志前受命于危难,出任夏进总经理。这个钢铁行业出身的男人,在吴忠本地也算是能呼风唤雨的人物。
张志前当然知道,自己接手的这个企业有些积重难返,他毅然决定治乱世用重典——以销定产,强行扭转夏进被动收奶的处境,同时制定69项430条质量管理标准,狠抓生产。张志前的思路很直接:以质量吸引代工,消化产能,先做一个勤勤恳恳的“炼奶工”。当务之急是要活下去。
张志前的务实很快获得了市场的肯定,凭借吴忠丰富的奶源,他拿到了乐百氏、娃哈哈等十几个品牌的代工,1999年还代工了蒙牛第一款液态奶。
夏进由此起死回生,成了宁夏响当当的知名企业;张志前则被奉为企业英雄,各种赞誉纷至沓来。
本土的成功令张志前渐渐开始心怀天下:守着如此优质的奶源,堂堂宁夏,缘何不能出一个全国性的乳业品牌?
很快,张志前将目光聚集到郑俊怀“奶源→工厂→市场”资源路线,提出“公司+基地+农户”战略,欲整合地方资源以图全国。仅仅凭着一笔2000万元的支农贷款,张志前就大胆将产业链前移,自建、联建养殖园区,遍布收奶站,其春风得意的开拓激情溢于言表。
此时的张志前踌躇满志,丝毫没有意识到凶险已经暗藏:郑俊怀当年跑马圈地时并无强劲对手,可谓抢占天时,而夏进却面对着以牛根生为首的“先市场主义者”的冲击,他们回款更快、运营更活、打市场也更暴力;自建养殖园区的资源战略周期漫长,夏进薄弱的融资能力将备受考验。
这些都不构成当前问题的关键,因为张志前现在更为急需的是一位深谙乳业市场前沿征伐之道的开拓者。而在此之前,夏进已经纵马扬鞭挺进了全国20余座城市。
2000年10月,张志前高调宣布,以20万元年薪招募市场营销副总经理。
首败
20万元年薪已是张志前自己的十倍,夏进可谓孤注一掷打天下,而它能招来的是何等人物仍是未知数。
胡永翔是张志前手中众多候选人之一。早在任瑞典利乐公司设备业务员时就与夏进有些交道,可谓渊源颇深。虽然有业内人士评价其“言谈中英文混杂,西装革履,不过盛名之下,其实难副”。但按夏进一贯的选将原则,这位“自己人”仍然成为了首选。至少张志前对胡永翔的加盟就表现得很兴奋,“胡永翔一个人就能增加400万元利润,值!”
胡永翔甫一上任便提出年增40%销售目标,这符合张志前的期望,也使他获得了实权。
然而,胡永翔之后的所有举措似乎都“仅仅是为了完成目标”。为促使销售额激增,胡永翔在东北、华北、华南等地遍撒办事处、分公司,大肆扩张“直营+代理销售”网络;由于资金有限,为抢夺代理商,他决定绕过成效相对较慢的广告投入,连续开出高折扣与铺货返现,不惜血本抢占终端。
胡永翔这种无足够的品牌战略支持,以透支经营模式为代价的做法,使得夏进很快被终端抛弃。石家庄的一位代理商回忆当时的状况时说:“胡永翔团队初入时的确气场强大,但几个月后优惠政策无力维续,夏进牛奶销量立即一落千丈。”
只是,隐患远非只此。夏进内部还发生了一系列对日后影响深远的事件。
张志前的市场团队是宁夏的本土骨干人员。但这些自成风俗、居功自傲的骨干们遍撒全国后却明显水土不服,个别销售经理甚至思家心切,终日无心恋战。
面对如此严峻的局面,胡永翔非但不做内部清洗,反而“大搞团结”。他拨付经费支持家属外驻,增加宁夏籍销售人员占比,美其名曰打造家庭氛围。这些明显本末倒置的举措,在市场人员中颇得民心。胡永翔的“大跃进”继续推进,夏进挺进全国26个省市250多个城市。
此时的张志前有些分身乏术,因为他正在四处找钱。
2002年五月,宁夏新华百货投资3500万元,占股60%入主夏进,张志前任董事长。
因为涉及“交权”,这次融资据说是张志前力排众议的结果,好歹新华百货也是本土企业,夏进原班人马也可保留。相比之下,牛根生则毫不忌讳所谓的“失权”,他拿到了摩根士丹利等投行总计6000多万美元的投资,十多倍于夏进。不过,夏进人并未意识到这些差距,他们还沉浸在2002年、2003年销售增长70%、大同生产基地竣工的喜悦之中。
风暴很快就来了。2003年11月,蒙牛3.1亿元拿下央视标王,随后趁热打铁在吴忠、灵武、银川等地闪电设立收奶站,以高于夏进的价格抢购原奶,运至内蒙古磴口生产液态奶,再以“买一送一”回销至宁夏。
面对凌厉攻势,夏进人有点蒙,大肆铺货的胡永翔渐失妙计,毫无反击之力。
2004年初,在江西抚州,孤立无援的销售经理自己请来了咨询公司把脉市场,其调查结果令人沮丧——无广告、无促销、无品牌影响力,终端只晓得铺货,管理人员奇少且懒散成性,甚至连统一的价格都不存在……
有人质疑胡永翔,为何夏进出师四年,知名度还不如卫岗、天友等地方品牌?胡永翔并未回答。2004年,他走了,转而成为某咨询机构的“营销大师”。
胡永翔在全国的大肆铺货浪费了过多资源,导致夏进在成本端、销售端双重受迫,没有任何品牌底蕴的市场一个接一个沦陷。至2004年底,夏进亏损1300多万元,第一次全国伐略悲剧收场。
再起
此时的夏进已从排名前六跌入中游,大同基地也委身蒙牛。夏进似乎只是出去逛了一圈,名字尚未叫响就回来了。
这当然不符合大股东的期望。夏进的兵败,张志前难辞其咎。
2005年,新华百货总经理邓军空降夏进,担任董事长,张志前黯然离去。
出身营业员的邓军是百货业赫赫有名的“铁娘子”,20年商场征战让她很清楚,欲再起全国伐略,必须求贤。邓军找到雷永军,邀其共谋大业。在夏进走了一遭,雷永军劝说邓军投入资金树立品牌,夯实地方市场再谋全国,但“新华派”只对他提全国再起。用雷永军的话说:他们就是想出去,所以要出去。
邓军求贤未果后,担子落在了毫无乳业经验、年已56岁的郑卫国身上。
企业转型或投入广告都不符合夏进的现状,毕竟这些都需要大量的资金投入,而夏进已是捉襟见肘。当2005年下半年家乐福招募自有牛奶品牌OEM供货商的消息传来时,郑卫国当即决定接洽。
表面上看这确实是一个机会,获得代工,夏进可以跳出价格战泥潭,抽身群雄纷争,以零进场费入驻家乐福优势渠道,再次“廉价”杀向全国。所以,当家乐福给夏进画了一块两年内给夏进带来2亿元销售额的饼,并以此提出统一物流系统要抽取15%的提成时,郑卫国仍然应允。
事实上,夏进的胃口更大——在家乐福渠道一年内达到5亿元销售额!
先不谈5亿元从何而来,郑卫国忽略了一个关键问题:品牌。与胡永翔类似,郑卫国只是短时间内大规模铺设了夏进的销路,但是在品牌推广方面毫无作为。而家乐福也并非一个合格的品牌寄主,很快,家乐福纯牛奶出现滞销。
屋漏偏逢连夜雨,2007年1月,夏进产“家乐福纯牛奶”因质量问题被国家质检总局叫停。它的结束更像是一场噩梦,夏进勉强收回了1亿元货款后终止代工。
2005年,夏进亏损达到3488万元。
进退
2006年4月,物美收购新华百货27.7%股份,成为其第一大股东。物美欲借新华百货打造西北平台,“新华派”则提出对等要求:搞活夏进!
为此,物美承诺三年内投入3亿元资金,将夏进带入全国五强。
一直缺钱的夏进第一次感到了资金充裕的饱足感,但一直埋头拉车的夏进却没发现,江湖已经不再是当初的江湖,问题很快将浮出水面。
手握巨资之后,市场、品牌自然应该手到擒来,何况夏进手中还攥着一张产品王牌——枸杞奶。夏进上上下下摩拳擦掌,急起第三次伐略。
也许是忌惮以往在品牌推广上吃的亏,邓军花重金请到曾为蒙牛策划人的李光斗。李光斗为夏进枸杞奶包装出养生(即功能奶)概念,宣扬乳业第三次革命,进而演化出礼品诉求,起名“全家好”,力邀“万人迷”陈好代言。策划一出,夏进在央视投放的价值6800万元的广告随之铺天盖地。
在李光斗的策划下,这也许是夏进二字第一次如此形象、活跃地呈现给市场。
借着这股热乎劲,2006年8月,营销总监陈翔宇适时启动全国总招商,银川现场王小丫、陈好、厉娜等星光熠熠,当李光斗上台致辞时,代理商们似乎已经能听到钱币落地的声音。
当日,陈翔宇一个字一个字地宣布:首日签约1.2亿元!邓军则感慨着品牌的力量,激动地答谢四方,遥望盛世。
然而,气势如虹的场面随后戛然而止。
2006年底,第一轮招商结束后,夏进央视广告数量突然锐减,各地销量随之迅速下滑。一位德州经销商抱怨道:“枸杞奶广告停播,促销减少,销量锐减……”
众所周知,李光斗的品牌战略是“投入广告,广告带动回款,回款再养广告,由此不断吹大市场”。蒙牛当年正处于中国乳业十倍速发展时期,回款充裕;夏进发力时,伊利、蒙牛、光明与地方乳企早已将市场瓜分殆尽,夏进要得到销售回款极其困难。要用物美投入的巨额资金走诸如蒙牛等乳业同样的路,已经走不通。
数字是最能说明问题的铁证——2006年,夏进扭亏为盈,但利润只有尴尬的50余万元。而此时一些莫名其妙的人事变动更加剧了夏进此役的全线溃败。
2007年初,对第三次伐略至关重要的陈翔宇出走夏进,李光斗及其团队也迅速销声。据知情人士透露,问题出在夏进高层,他们从无长期品牌战略,更看淡后期广告投入,这实际上断了策划团队的战略补给。而夏进与李光斗的合作更似短期雇佣,李并未进入决策层,毕竟他只是个外人。
一位离职员工曾痛心地描述当时的夏进:“上上下下的领导玩弄权术的多,勾心斗角的多,阿谀奉承的多……”盲目信任本土团队,拒绝外部势力进入,内部用人不贤,任人唯亲,已然成为夏进资金、人才、时机等种种问题的致命催生剂。
种种迹象表明,此时的夏进应当收缩战线,韬光养晦。但在2007年3月,更大的动作出现了:新华百货、物美、欧洲瑞寰基金合资3700万美元成立宁夏寰美乳业,共同控股夏进,同时斥资4000万元上马奶粉项目。按照部署,夏进将寻求3~5年内上市,融资后继续谋求全国伐略,甚至高调提出打造中国乳业第一品牌的目标。
更为蹊跷的是,邓军请回了胡永翔!
为什么?也许,这个问题更应该问胡永翔。彼时的夏进高层处处燃烧着权力博弈的火苗,掌势的“新华派”与“物美派”无论在人权、财权,哪怕是促销费用、广告审批上,都能大动兵戈。一个极其简单的市场方案能在多方力量的权衡下,被不断地讨论、再讨论,无限期延迟出台。
或许夏进真有些时运不济,又一场行业大劫即将彻底结束夏进的第三次全国伐略。
保卫
“内蒙古乳业巨头”频频高价收奶的举动终于触动了宁夏当地奶贩的神经,2007年下半年,他们控制了宁夏60%奶源,囤奶居奇,原来1.7元/公斤的奶价涨到每公斤3元以上。而蒙牛、伊利也趁机不惜代价继续高价收奶。
胡永翔宿命般地再次遭遇奶源偷袭。“一吨奶运至广东亏1000元,运到陕西、甘肃亏300元,夏进日产300吨以上,至少亏10万元!”
这也是邓军的命,张志前为“新华派”留下的奶源,今朝却竞相叛离投奔他人。无奈之下,2007年底,邓军联合宁夏18家乳企上书政府:“就目前宁夏奶产业而言,前景令人担忧,稍有不慎,将会给宁夏奶产业、乳品加工业带来灾难性的打击!”
邓军等人的上书更像一种哀鸣,也许她心里明白,倾尽全力的第三次伐略即将彻底结束,天意弄人!
“命运垂青了蒙牛、伊利,却不愿眷顾夏进一次,哪怕一次。”一位宁夏乳业资深人士悲叹道:“夏进历代的领导者都慢一拍:他做奶源时,别人在做市场;他做市场时,别人在做品牌;他做品牌时,别人开始端他的奶源了!怎么把握机会?”
很快,噩耗传来了,整个东北、广东、福建……全部沦陷。胡永翔打起了退堂鼓,他向上汇报,如果原奶再涨价,夏进就该放弃大众奶制品,彻底转型……
2007年12月,刚刚过了试用期的胡永翔第二次出走了。
蜀中无大将,廖化作先锋。夏进一直以来所托非人,能人也鲜来夏进。塞上江南水土丰美,却始终没有孕育出一位牛根生、郑俊怀般的人物。
胡永翔走后,邓军开始内部整顿:关闭银川工厂;调整产品结构,淘汰低利润产品;将市场重心放在黄河流域,不久又更精确地划定为陕甘宁地区;废除原有直营模式,开始部分采用完全的经销商模式。
自此,夏进正式进入战略防守阶段。
邓军开始将工作重心转移到保护奶源,她亲自去看望奶农,对生活困难奶农施以钱物援助。她最终选择了三元、新希望等地方乳企的思路:只做地头蛇。
值得庆幸的是,邓军的努力收到了一定成效,她守住了大本营,2009年宁夏寰美乳业实现了1893万元利润。
不知疲倦的三次全国伐略终于落下了帷幕,“新华派”为荣誉与尊严而做大夏进的梦想随之泯灭。但是,夏进真能如此平静下去吗?
最后一役
“宁夏,中国第二大奶源产地!”顶着如此耀眼的名号,夏进注定不可能独善其身。
2010年7月,伊利总投资4.89亿元的新工厂落户吴忠;随后,蒙牛总投资7.5亿元的高端液态奶项目在银川开工。
同样发现“风吹草低见牛羊”美景的,还有旺旺、娃哈哈、维维……
然而,数据显示:吴忠原奶产量1000吨/日,夏进需求200~300吨/日,伊利需求100~200吨/日,而伊利新工厂就能消化520吨/日……缺口明显。
虽然用宁夏乳制品工业协会秘书长赵淑铭的话来讲,“蒙、伊新工厂要两年后才能建成投产,目前对夏进而言影响不大,它仍然是宁夏市场份额最大的乳企。”
但是,两年后呢?即便是今日,夏进也不再是宁夏唯一的宠儿。
2010年8月,中国乳制品工业协会年会在银川召开,一个熟悉的身影穿梭于各位大佬之间,谈笑风生,他所执掌的红果乳业是大会的主赞助商。
他,就是张志前。当年张志前并未远去,他用毕生积蓄买下吴忠一个小型的乳企,誓要重头再来。五年前的惨败,让他受益匪浅,只可惜他与夏进早已泾渭相隔。
张志前的主打产品是枸杞奶粉与液态奶,他的得力部下陈玉海,曾是夏进分公司掌舵人。2010年2月,金河乳业、北方乳业、红果乳业联合组建宁夏塞尚乳业集团。这被视为张志前部署下的宁夏乳业战略整合第一步,其第二步是在未来4~6年内做到上市,取代夏进成为宁夏第一乳企。
二者日后必将有一场地方恶战,或许,这将是夏进的最后一役,已无退路。
时间还有两年,夏进,夏进!
编 辑 胡 茜
二进制代码内联库函数识别 篇4
随着计算机软件业的不断发展,计算机软件安全日益引起人们关注。二进制代码分析是计算机软件安全领域的一个重要手段。在分析某些无法获取源代码的软件时,分析其二进制代码几乎是唯一手段。人们很少直接分析二进制代码,因此一般都是先将机器代码反汇编成汇编代码。库函数识别的作用在于可以直接将反汇编代码中的大段代码替换成可理解的符号( 函数名) ,便于分析人员理解整个程序的反汇编代码。在编译优化的作用下,内联库函数在内联到目标代码后,形态可能发生变化。因此,内联库函数识别存在两个难点要解决。首先,为了对齐指令地址,或指令流水优化, 编译器可能会调整一个函数的某些指令顺序,造成内联库函数字节不连续。其次,编译器寄存器分配策略也会影响内联后的指令,使其发生变化。针对这两个问题,本文基于执行流图来识别内联库函数。
1库函数识别
1. 1执行流图
执行流图EFG ( Execution Flow Graph) G = ( V,E) ,V代表指令集合,代表指令之间执行依赖关系。边( vi, vj) 表明vi早于vj的执行。使用R/W表示指令读/写的变量集合,D表示指令的地址。
一个EFG中的边有两类。第一类边在基本块( 单进单出的指令序列) 内。对于基本块内的两个点a,b,如果满足( Ra∩ Wb) ∪( Wa∩ Rb) ∪( Wa∩ Wb) ≠Ø,Da≤Db,或者b为控制流转移指令,则存在a到b的边。另一类在基本块间。 边( a,b) 满足:
( 1) a和b分别在不同的基本块B1和B2内;
( 2) a可以在基本块B1中最后执行,b可以在基本块B2中第一个执行;
( 3) 在控制流图中,B2是B1的后继。
EFG的构造分为两步。首先,划分函数的基本块,构造控制流图。然后,在基本块内进行数据依赖分析,得到局部EFG。最后,对于每对在控制流图中直接相连的基本块,连接其所对应局部EFG中的出口点和入口点。对于局部EFG中的任意三点A,B,C,如果存在三条边( A,B) ,( B,C) , ( A,C) ,则删除边( A,C) ,因为这条边是冗余的。
1. 2指令编码
指令编码用来将一个指令转换到一个标准形式。首先, 一条指令通过下列步骤规范化来消除指令差别:
( 1) 指令规范化。使用reg1来表示指令操作数中的第一个寄存器,reg2表示第二个寄存器,以此类推。如“mov eax, ecx”“mov reg1,reg2”,“xor eax,eax”“xor reg1,reg1”。
( 2) 内存规范化。使用M表示访存操作数,如“mov eax, [ebx]”“mov reg1,M”。
其次,用二元组SR = ( m,r) 表示消除差异后的指令,其中m表示指令助记符,r为操作数特征值。r中的数字,从高到低,表示操作数的类型。如r = 1表示“op reg1”,r = 11表示“op reg1,reg1”,r = 21表示“op reg1,reg2”。表1给出了指令的所有可能特征值。
最后,SR = ( m,r) 通过调用函数ID( SR) = Hash( m) | ( r < < 16) 转换为一个32位数字,称为此指令的ID。Hash ( ) 是一个字符串函数,将不同的指令助记符映射到不同的16位整数。在同构测试时,指令只要有相同的ID,即认为这些指令是相等的。
1. 3识别
在库函数集合F中目标函数fT的过程如下:
( 1) 反汇编fT;
( 2) 构造fT的CFG;
( 3) 对于F每个内联库函数fL:
1构造fT的EFG;
2检测GT中所有与fL的EFG同构的子图;
3检测每个检测到的子图是否可以外联( 参见本文之前的工作[1]) ;
4报告每个检测到的可以外联的子图为一个库函数。
2实验
2. 1设置
实验所用开源程序列表如表2所示。相应地,分别使用Microsoft Visual C + + 10 ( MSVC ) 和Intel Compiler XE 14 ( ICC) 编译,并生成调试信息。
由于源代码和二进制代码间存在巨大差异,二进制代码中的内联函数的真实信息几乎不可能获知。内联函数和其余代码之间没有明显分界。任何代码片段都可以视为某个内联函数的实例。但由于实验对象是开源软件,因此在一个内联函数之后可以插入一些特殊代码,就可以定位到内联函数的真实信息且不会影响内联函数的EFG。
从源代码编译得到的二进制文件称为原始文件集。从修改后的源代码编译得到的可执行文件称为修改的文件集。 在修改的源代码中,一些函数的随机位置被插入宏“LIBV ( P) ”。P是一个指针或者一个变量的地址。在宏里,输出库函数的结果到屏幕,使得插入代码不会被当成死代码。然后修改宏的定义来生成修改的二进制文件集。strlen( ) 的定义为“#define LIBV( P) printf( " libvcode % d" ,strlen( ( char* ) ( P) ) ) ”。其他函数类似。printf的特殊格式有助于在汇编代码中识别插入的代码。比如在识别strlen( ) 中,代码
其中,位于loc_40B600和push eax之间的代码是strlen ( ) 的一个实例。
实验中的内联库函数有strlen( ) 、strcpy( ) 、strcmp( ) 、 memcmp( ) 。这些函数经常被MSVC内联。相应的源代码来自“Microsoft Visual Studio 10. 0 VC crt src”。汇编代码来自Visual C + + 10,使用参数/FAcs编译( 输出汇编代码,机器代码和源代码) 。编译使用这些库函数的样本代码并提取内联的代码。
对于原始文件集,如果识别出的内联函数在源代码中能找到,则认为识别结果是正确的。原型工具在原始二进制文件集中识别所有4个内联函数。函数strlen( ) 、strcpy( ) 、strc- mp( ) 在C / C + + 程序中常见。在C + + 中标准字符串类的操作包含了这些C字符串函数。在原始二进制文件集的实验中,这些识别结果也会被认为是正确的,即使识别出的函数没有在源代码中显式使用。对于修改的文件集,只统计以 “libvcode% d”为格式化字符串的printf结尾的识别结果。内联函数的真实情况由IDA的一个插件来统计,通过扫描以 “libvcode% d”为格式化字符串的printf得到。
由表3中可见,除了Win Merge,其余程序的每种内联函数数量都不相同。因为一种内联函数的文件集是通过改变插入宏的定义来生成的,这就使得理论上不同内联函数的数量应该一致。但是,一个内联函数实例的数量在没有检查二进制代码前是不确定的,因为某些被插入宏的短的目标函数可能会被编译器内联。另一方面,源代码中插入的宏在编译预处理阶段被展开,增加了一个目标函数的大小。因此,一些目标函数在宏定义为一种内联函数时会被内联,而在宏定义为另一种内联库函数时则不会被内联。
2. 2实验结果
表4和表5分别给出了MSVC和ICC在原始文件集上查准率。表中的'- ' 表示无法计算值。原始文件集里的内联库函数的真实情况未知。因此在表4和表5中查全率无法给出。表6给出了MSVC编译的修改的文件集的查全率和查准率。Win Merge中的strcmp的查准率是空的,因为strcmp在Win Merge中没有被内联。ICC编译的修改的文件集的实验结果没有列出,因为没有发现任何结果。
2. 3讨论
2. 3. 1查准率
表4表明原型工具可以准确地识别内联函数。在原始文件集中仅有少数误报。误报是因为工具无法区分字符串函数的宽字节版本和非宽字节版本。类似wscmp( ) 被误认为strcmp( ) 。两者之间代码的差别就在于操作数的大小( 宽字节版本16位,非字节版本8位) 不同。而在指令编码中, 不考虑操作数的大小,因此导致了上述误报。
2. 3. 2查全率
如表6所示,在修改的文件集中,除了memcmp( ) ,查准率都很高。这是因为memcmp( ) 的指令发生了改变。代码如下所示。
通常,有三个原因造成漏报。首先,函数的反汇编代码可能是不完整的。在反汇编中,工具在遇到间接跳转时停止反汇编。在修改的文件集中,有些代码是插入到了一个case语句中。因为switch/case语句常被编译器翻译为间接跳转, 因此这些内联函数没有被工具识别。
其次,在编译器优化后,一个内联函数可能有不同的指令序列。大多数的漏报都是由于这个原因。比如,编译器可能将一条指令替换为语义等价的指令。如test eax,eax可以替换为cmp eax,ebx,当ebx值为0时。内联函数的参数可以通过寄存器或内存来传递。传递方式也会影响一个内联函数的指令。memcmp( ) 参数count保存到了局部变量var_ 268中,而在库函数中则是一个寄存器中。其他优化,如循环判断外提和循环展开也会影响识别结果。
特别地,一个内联函数可能消失在二进制代码中。一个表达式的结果可能会在编译时被编译器计算出。如strlen( ) 的参数是一个固定字符串,编译器会直接计算出字符串的长度,而不会生成调用strlen( ) 的代码。因此,一些内联函数可能在修改后的文件集中没有出现在期望的位置,也就没被工具发现。
最后,一个内联函数在不同的编译器编译后可能有不同的指令序列。在实验中,因为内联函数的代码是从MSVC中提取,这些代码可能会和其他编译器编译的完全不同。在ICC编译的代码里,由于某些未知原因,strlen( ) 和strcpy( ) 不总是内联。memcmp( ) 和strcmp( ) 被ICC内联,但是对其编译后的二进制代码却与MSVC编译的有所不同。因此,和MSVC编译的原始文件集的实验结果对比,ICC编译的原始文件集中却只有很少的内联函数获得识别,如表5所示。
3相关工作
最负盛名的库函数识别技术是IDA FLIRT[2]。使用字节模式匹配算法来判断一个目标函数是否与IDA已知的签名匹配。DCC[3]类似于FLIRT。Hancock[4]扩展了FLIRT技术,提出一个库函数引用启发规则,认为一个函数如果在一个库函数中被静态调用,那么该函数也是库函数。这些方法的主要缺陷在于一个函数只有头n个字节作为匹配模式。 尽管通过增大n的大小,精度可以很容易获得提高。但是不能保证导入所有库函数。UNSTRIP[5]通过系统调用接口即可识别在二进制代码中的包裹函数( Wrapper Function) 。尽管如此,这个方法却只是局限于识别包裹函数,因为一个库函数可能没有call指令。
最近,文献[6]提出了一个二进制代码搜索的技术。为了计算函数间的相似性,即将函数分解为连续,且简短的代码序列。本文方法和该文献中的方法都需要和编译器优化。 而且,文献[6]中的方法的最大限制是可能产生差的结果,当匹配拥有低于100基本块的函数。
Saed等人提出了一个通过匹配语义整合图的短路径( 轨迹) 识别二进制代码中复用函数的新技术[7]。一个语义整合图整合了控制流图,寄存器流图,函数调用图。尽管这一方法和本文方法相同之处都是基于图,但是其中的匹配过程和本文却完全不同。另外,该法在图上定义了不同类型的轨迹,并且是使用图编辑距离来衡量两个图的相似度。
4结束语
识别不连续字节或有多个变种的库函数是困难的。本文介绍了一个识别内联库函数的新方法。方法的新颖性在于将库函数识别问题转化为EFG子图同构问题。在一些流行软件上设计了一定仿真,从而验证了本文方法的有效性。 如何加速子图同构测试将是本文下一步的重点研究工作。
摘要:内联库函数识别是二进制代码分析的难点问题之一。主要的挑战来自在编译优化的作用下,内联库函数在目标函数中存在多态性和不连续性。本文构建函数的执行流图,将内联库函数识别问题转化为执行流图子图同构测试问题。实验中,对四个常被编译器内联的字符串操作函数,使用MSVC10和ICC14这两个编译器在5个开源软件中进行内联库函数识别测试。实验结果表明,本文方法可以有效识别二进制代码中的内联库函数。
退二进三 篇5
改造管理办法(试行)
市政[2007]45号 二00七年五月十四日
根据桂林城市总体发展规划,为改善环境和优化城市功能布局,推进工业化进程,按照“搬大、搬强、减污”的原则,鼓励工业企业通过整厂异地搬迁改造寻求更大发展,腾出黄金地段,大力发展第三产业,特制定本管理办法。
一、企业申请异地搬迁改造的基本条件
凡列入市区总体规划(包括土地利用规划)、城市建设改造中需搬迁的或因发展空间不足需寻求发展的工业企业(不分企业所有制性质)均可申请“退二进三”异地搬迁改造。搬迁建设新址应进入本市工业园区选取,并按国家有关规定取得新的建设用地。
二、报批程序
(一)“退二进三”搬迁改造工业企业应提出申请,编制“退二进三”搬迁改造方案,经主管部门审核同意后,上报市工业企业“退二进三”工作领导小组办公室(办公室设在市经委)。
(二)市工业企业“退二进三”工作领导小组办公室审核企业申报的材料后,组织市发改委、经委、建规委、财政局、国土资源局、环保局、国资委等市工业企业“退二进三”领导小组成员单位,对申请“退二进三”搬迁改造工业企业提出的搬迁改造方案进行论证,提出初审意见后报市政府审批。
(三)经市政府审核同意、下达批复文件后,企业方可实施“退二进三”搬迁改造并享受相应的优惠政策。
三、优惠政策
(一)列入市重点技术改造项目计划的 “退二进三”搬迁改造项目,有关部门优先给予办理审批或报建手续。
(二)“退二进三”搬迁改造企业的老厂区土地使用权出让按《桂林市企业使用土地资产处置补充意见》(市政[2005]51号)的规定办理,企业可以到市土地储备交易管理中心选择委托招标、拍卖挂牌处置或收购储备,企业所得的土地成本收入可作为搬迁改造启动资金。土地成本由市土地储备管理中心提出初步意见,经市财政局审定后执行。
(三)企业拟出让的老厂区土地按法定程序招拍挂处置后,扣除土地和土地交易成本及有关税费后的增值净收益全部进入市财政专户,在企业搬迁改造过程中按以下标准支持企业发展:
1、企业搬迁改造投资总额小于或等于土地成本收入的,土地增值收益不再支持给企业。
2、企业搬迁改造投资总额超出土地成本收入,其超出额在土地增值净收益50%以内(含50%),按土地增值净收益的30%支持给企业,但支持金额与土地成本收入之和不得高于企业搬迁改造投资总额。
3、企业搬迁改造投资总额超出土地成本收入,其超出额在土地增值净收益50%以上的,按土地增值净收益50%支持企业,但支持金额与土地成本收入之和不得高于企业搬迁改造投资总额。
4、符合产业政策或市政府重点鼓励发展的工业项目,在实行上述第2目、第3目标准的基础上,经市政府批准,可适当提高土地增值收益支持比例,但支持金额与土地成本收入之和不得高于企业搬迁改造投资总额。
四、资金管理和使用
(一)企业老厂区土地处置后支持给企业用于搬迁改造的资金在市财政局设立专户管理,专款专用。
(二)由企业提出搬迁改造建设进度和资金使用计划,市工业企业“退二进三”领导小组办公室按企业搬迁实际建设进度提出拨款意见,由市财政局审核后拨付。从支持给企业的土地增值收益中预留5%,待项目通过竣工验收后再支付给企业。
(三)项目开工后,企业每季度须以书面形式将项目建设进度和资金使用情况向市工业企业“退二进三”领导小组办公室报告,并抄报市财政局。
五、其他规定
(一)企业“退二进三” 搬迁改造方案从市政府同意批复文件下达之日起,两年内没有开工建设的,视同企业自行放弃,原有批文自行废止,并取消享受有关优惠政策的资格。
(二)实施“退二进三”搬迁改造的工业企业,享受的优惠政策由市“退二进三”办公室负责监督和管理。对不按规定程序和要求实施的,报市政府批准后停止其享受优惠政策的权利,并追回已执行的优惠政策中有关资金。
(三)企业搬迁改造投资总额,以经批复的项目初步设计的概算投资总额为准。
(四)使用了政府支持资金的搬迁改造项目,必须通过市工业企业“退二进三”工作领导小组办公室组织的竣工验收后,才能办理固定资产交付使用手续。
(五)本办法由市工业企业“退二进三”工作领导小组办公室负责解释。
(六)本办法自颁布之日起施行,本办法颁布前原有规定与本办法不一致的,按本办法执行。
附:
《桂林市工业企业“退二进三”
搬迁改造管理办法(试行)》调整补充意见
市政[2008]11号 二00八年二月三日
根据国务院对我市城市发展规划的总体要求和自治区党委、政府关于“保护漓江,发展临桂,再造一个新桂林”的发展战略及市委三届三次、四次会议精神,为进一步优化工业布局,促进产业升级和集聚,按城市规划需要搬迁的市区工业企业必须在3年内(从2008年1月至2011年1月)完成 “退二进三”搬迁改造,现对《桂林市工业企业“退二进三”搬迁改造管理办法(试行)》(市政[2007]45号)作出如下调整补充:
一、工业企业搬迁改造投资额超出土地成本收入,其超出额在土地增值净收益50%以内(含50%)的,土地增值净收益支持企业比例由原来的30%提高到50%,但支持金额与土地成本收入之和不得超过企业搬迁改造投资总额。
二、工业企业搬迁改造投资额超出土地成本收入,其超出额在土地增值净收益50%以上的,土地增值净收益支持企业比例由原来的50%提高到80%,但支持金额与土地成本收入之和不得超过企业搬迁改造投资总额。
三、工业企业搬迁改造投资总额高于土地成本收入与土地增值净收益之和的,按土地增值净收益的100%支持企业用于搬迁改造。
四、申请“退二进三”搬迁改造的工业企业,必须搬迁到工业园区政府规划指定地点。在取得政府同意搬迁改造和企业新址用地批准文件后必须在两年内完成搬迁改造,并竣工投产,未按规定时限完成搬迁改造的企业不享受本优惠政策。
五、搬迁改造工业企业与市土地储备交易管理中心签订原厂区土地收购储备合同后,由企业提出申请,经市经委和财政局审核同意后,可提取土地收购成本资金总额的100%作为企业购买新厂址土地和项目建设启动资金。
六、搬迁改造工业企业后续支持资金的拨付,由企业根据项目进展和投资进度情况,向市工业企业“退二进三”工作领导小组办公室提出分批用款计划,经审核同意后,报市财政局备案。市财政局按以下标准核拨用款计划:企业新址用地取得政府批准文件后核拨资金支持总额的30%;企业新址地上建筑物(主厂房、综合楼等)封顶后,核拨资金支持总额的30%;完成设备安装,核拨资金支持总额的30%;预留资金支持总额的10%,待市经委(市工业企业“退二进三”工作领导小组办公室)组织有关部门对企业搬迁改造进行竣工验收后再拨付到企业的资金专户。
七、工业企业搬迁改造实际投资总额的确定,必须经市经委(市工业企业“退二进三”工作领导小组办公室),指定或委托中介机构,根据企业提供的有关合同、发票等材料进行审计,并将审计报告报市审计局进行审核,作为搬迁改造项目验收的依据。
边玩边学二进制 篇6
二进制拼图
剪若干张矩形的纸片,纸片的宽度和长度的比例为1:1.414,暂且把这样的形状称为A形拼板,然后在白纸上由大到小画出几个空白框(如图1),不同大小的框的边长比例也是1:1.414,最小的空白框的形状与A形拼板一样。游戏规则很简单:任意取出一些A形拼板,尝试将这些拼板填满几个空白框,注意填完后图形要完整并且拼板不能有多余的。假设由大到小预先设置A、B、C、D共4个框,经过实验可发现,如果有10块拼板,则恰好可以填满A和C(如图2);如果是7块拼板,则可以填满B、C和D。
如果把所填满的框标为1,把空白的框标为0,那么就可以看出,纸片的数量正好对应由框所表示的二进制编码,10张纸片是1010,而7张纸片是0111。很容易看出,之所以有这样的效果,其实与二进制的权重有关。细心的读者可能会发现,实际上并不需要很费心去量尺寸,直接拿标准的A4或A3纸张反复对折,按折痕剪开得到的矩形,其比例正是1:1.414。
二进制牌
找六种不同颜色的“牌”,如红色、黄色、蓝色、绿色、白色、黑色,用现成的小块积木、多米诺骨牌或是用纸板涂上颜色都可以,记住以下规则:①每看到两个红色,则替换成一个黄色;②每看到一个黄色、一个白色,则替换成一个黄色、一个白色、一个蓝色;③每看到一个黄色、一个红色、一个白色,则替换成一个红色、一个白色、一个绿色;④每看到一个黄色,则替换成一个红色;⑤每看到一个黑色、一个红色、一个白色,则替换成一个绿色。
牌的初始状态,都是由一块黑色开始,然后放若干块红色,最后由一块白色结束。然后按规则中的顺序,从第①条替换规则依次做到第⑤条,结束后再重头开始。那么,这些规则究竟有什么用处呢?不妨用“黑红红红红红红白”的初始状态来试一下。第一步:每看到两个红色,则替换成一个黄色,则初始的状态变为“黑黄黄黄白”;第二步:每看到一个黄色、一个白色,则替换成黄、白、蓝,于是状态再变为“黑黄黄黄白蓝”;第三步:黄、红、白变成红、白、绿,由于先前的状态中找不到黄、红、白,于是跳过;第四步:每看到一个黄色,则变成一个红色,于是状态变为“黑红红红白蓝”;第五步:黑、红、白变成绿色,由于先前的状态中找不到黑、红、白,于是跳过;第六步:重新匹配第①条规则,两个红色变一个黄色,于是状态变为“黑黄红白蓝”;第七步:黄、白变成黄、白、蓝,由于先前的状态中找不到黄、白,于是跳过;第八步:黄、红、白变成红、白、绿,于是状态变为“黑红白绿蓝”;第九步:每看到一个黄色,则替换成一个红色,由于先前的状态中找不到黄色,于是跳过;第十步:黑、红、白变成绿色,于是状态变为“绿绿蓝”,由于再也没有可替换的可能了,于是替换就在这里停止。
一种改进的二进制防碰撞算法 篇7
近年来, 随着物联网概念的提出, 相关的理论研究得到迅速发展[1]。RFID作为物联网的一项核心技术, 成为近年来的研究热点。而标签碰撞是制约射频技术发展的一个关键问题。随着阅读器范围内标签数量的增加, 碰撞问题将导致阅读器范围内标签的吞吐率急速下降、识别速度和识别率降低。多标签防碰撞算法使得阅读器能同时识别其范围内的多个标签, 对RFID系统的运行速度和可靠性至关重要, 因此对防碰撞算法的研究是必须的。
目前, 常用的防碰撞算法都是基于时分多路算法[2]。时分多路法又分为基于时隙的ALOHA算法及其改进算法和基于树的二进制防碰撞算法及其改进算法两大类。ALOHA算法属于不确定算法, 优点是系统实现相对简单。缺点是存在无法识别某个或者某些标签的可能[3], 特别是在标签数量很大时算法效率迅速降低。改进的ALOHA算法主要通过对标签进行分流[4]以及估计阅读器范围内标签个数并以此来动态调整帧长[5]来提高标签的识别效率。改进的ALOHA算法的优点是:标签漏读率有所降低, 吞吐率增加, 但是始终没从根本上解决标签漏读的情况。二进制防碰撞算法是一种确定性的算法, 能100%地识别阅读器范围内的所有标签。缺点是系统设计相对复杂。大部分二进制防碰撞算法的文章主要从以下几方面进行改进:1) 减少阅读器的寻呼次数[4,5];2) 减少标签和阅读器每次通信传输的字节数[5,6,7,8,9], 从而减少算法的识别时间。二进制树算法识别率相比ALOHA算法较高。并且适用于有大量标签需要准确读取的情况。
本文提出的改进算法基于二进制树算法。现存的几种比较常用的改进的二进制树算法有如下两种:1) 返回二进制搜索算法[4], 该算法相对于传统二进制树算法的优势在于阅读器成功识别一个标签后返回到父节点, 而不是返回到根节点。从而减少了阅读器的寻呼次数, 但是需要以标签的UID作为搜寻索引, 搜寻时间相比于二进制树算法有所降低, 但是仍存在可以改进的地方;2) 改进的类二进制数算法[5]—跳跃式类二进制数算法[6]做分析, 该算法采用在标签上设置一个计数器来实现不用发送标签UID的方式实现防碰撞, 该算法虽然减少了每次标签发送的数据量, 但却是以阅读器的寻呼次数增加为代价的。
本文提出了一种改进的二进制树算法。改进的算法规定发生碰撞时, 阅读器发送一个Call (m, n) 命令, 使得标签UID从最高碰撞位开始的3bit UID被通过一种计算规则生成1字节的数据返回给阅读器。该数据包含了标签这3bit UID的具体值, 该值具有唯一性 (即标签当前3bit UID不同返回值不同) , 即便碰撞后阅读器依然能正确识别出该值, 并以此为索引寻呼, 这样就减少了阅读器的寻呼次数。随后, 通过仿真与其他改进二进制树算法对比, 证明了改进的算法在搜寻次数以及搜寻时间上相较另外两种改进二进制树算法的优势。
1 几种常用改进的二进制树算法
在二进制算法中, 为了能使阅读器准确识别标签碰撞位的位置, 通常采用Manchester编码。普通的类二进制搜索算法, 例如返回类二进制树算法, 通过标签的计数器来获取标签位的准确信息, 虽然让编码方式更加自由, 但是增加了软硬件的负担, 因此改进算法采用Manchester编码识别碰撞位的准确位置[7]。
根据标签的标准通信协议规定的传输速度为12.5μs/bit, 则算法的识别时间T与搜寻过程中需要传送的比特位呈正比。在信号传输过程中, 为了便于互相区分, 必须在信息的头部和尾部各加上一个“NULL” (占用5个比特位) 。当标签返回信息时, 阅读器需要占用1个bit周期来校验接收到的数据是否存在错误。如果收到的数据没有出现碰撞, 则阅读器还需要2个bit周期的时间记录标签的UID信息。下面对常见的两种改进的二进制防碰撞算法进行分析。
1.1 返回二进制树算法
返回二进制树算法特点是:在进行搜索的过程中阅读器依次记录下标签发生冲突节点即父节点, 直到完成一个标签的识别。然后返回上一级父节点继续识别其他的标签, 而不是像二进制树算法返回到根节点重新进行识别。因此返回二进制树算法主要是通过减少阅读器对标签的搜寻次数来减少阅读器的搜寻时间。
对返回二进制树算法[4], 根据文献[4]可知, 假设阅读器范围内有m个UID长为n bit的标签。
则阅读器的寻呼次数为CDBS=2×m-1。
由于返回二进制树算法的命令只有Rq () 则寻呼时间为:
1.2 跳跃类二进制树算法
使用跳跃类二进制树算法阅读器每次只接收l bit的数据, 阅读器就不需要对所有标签进行同步, 因此编码方式更加自由, 实现起来更加容易。跳跃式二进制防碰撞算法的搜寻时间与阅读器范围的标签个数和标签的位数成正比, 假设阅读器范围内存在n个UID为m bit的标签时此算法的搜寻次数C=0.65×m×n次。寻呼次数太高, 导致算法的识别效率较低。
对跳跃式类二进制树算法[6], 由文献[6]可知, 搜寻时间为:
1.3 返回式类二进制算法
该算法是基于类二进制算法的基础上提出需要标签内部的一个碰撞计数器collion_count[]用于记录碰撞位父节点的位置。将冲突位1的标签的collion_count[]值加1, 并以collion_count[]和标签位数作为寻呼标准, 相对于类二进制算法成功地减少寻呼次数。
由文献[1]可知, 该算法的阅读器寻呼次数为:
寻呼时间为
2 改进的二进制树算法
改进的二进制树算法, 如返回二进制树算法每次都需要传送标签的UID, 因此冗余信息比较多。从而使得算法的搜寻时间比较长。改进的类二进制树算法, 如跳跃式类二进制算法虽然减少了标签与阅读器每次交互需传输的数据量, 但却是以增加阅读器的寻呼次数为代价的。
2.1 改进算法思想简介
改进的防碰撞算法, 都是基于两方面的事实来提高算法的性能, 即一是减少标签和阅读器每次交互所需传输的数据, 二是减少第一次寻呼以后搜寻标签所需寻呼的次数。本算法主要是从不增加每个时隙传输数据的前提下, 减少阅读器对标签的寻呼次数。
本算法根据碰撞后Call (m, n) 命令要求计算的uid位数k (2位、3位或者4位) , 让标签预留2k字节的寄存器buffer[], 用来暂存标签通过计算生成的将要发送给阅读器的数据。本文以n=4为例 (具体原因见2.3节) , 首先对改进算法需要用到的一些命令做简介。命令的具体用法参见2.2节。
Rq (u) —UID前几位与u相同的标签将其剩余部分的UID发送该阅读器。
Call (m, n) —UID前几位与m相同的标签将其n~n+3位UID做运算, 运算方法见标签的程序执行要点, 将运算所得值存入Buffer[]中, 并发送给阅读器。
C语言应用在单片机编程时具有易于移植、维护等优点, 因此在实际应用中, 需要实现二进制防碰撞算法时, 一般都采用C语言编程。所以, 本文采用C语言的伪代码对算法执行过程中的核心程序做简要说明。
为了方便表述本算法, 首先对本文用到的一些C语言运算符以及运算目的做简介。
<< (>>) 表示:按位左移 (右移) , 移位后空余的最低 (高) 位由0补足。
规定:当发生碰撞时标签接收到Call (m, n) 命令时, 需要计算的uid位数为k位 (k=2, 3, 4) , 并且标签需要预留2k字节给寄存器buffer。且根据k取值不同, buffer长度及初值如表1所示。
规定:标签UID高位到低位依次为1—s位, 如图1所示。
运算目的如下:将标签的n~n+2位UID变成“不会碰撞”的值, “不会碰撞”就是在标签发生碰撞时, 阅读器也能正确识别出接收到的数据。标签通过如下计算得到的buffer值, buffer值的二进制表示形式有且仅有一位为1 (其余位都为0) 。
在算法的识别过程中标签需要执行操作的程序要点如下:
如果k=4则buffer初值为0x0001, 当n~n+3位值不同时标签计算得出的buffer值不同, 如表2所示。
在算法的识别过程中当发生碰撞时, 阅读器需要执行的操作的程序要点如下:
所以当发生碰撞时, 标签向阅读器发buffer值, 而不直接发送uid。如果有大于一个标签向阅读器发送其buffer的值, 则阅读器记录下收到的buffer值, 每个碰撞位对应一个Buffer值。将每个碰撞位依次分别置1, 其余位补0, 还原buffer值。下面举例说明这样计算的优势:假设阅读器范围内存在三张标签, 前3位uid分别为:1000, 1100, 1111。那么做运算后, 三个标签分别将buffer值为0x0100, 0x1000, 0x8000发送给阅读器, 曼彻斯特编码解码后阅读器将收到的数据为x00x 000x 0000 0000, 有三个碰撞位第1、4和第8位, 首先将第八位置1其余位补0则可得0000 0001 0000 0000, 同理得到第四位碰撞位对应的buffer值为0001 0000 0000 0000。第一位碰撞位对应的buffer值为1000 0000 0000 0000这样就还原了碰撞前的buffer值。阅读器知道了其范围内标签前4位uid值存在如下3中情况:1000, 1100, 1111, 并以此为索引依次寻呼。
2.2 改进算法流程
本文提出的改进算法的处理流程如图2所示。
为了清楚地介绍本算法, 假设阅读器范围内有10张uid长度为8 bit的标签, 标签uid值如表3所示。
根据图2所示算法流程, 表3所列10张标签的识别过程概述如下:
1) 所有进入阅读器范围内的标签都处于Unselect状态。阅读器发送Active () 命令激活阅读器范围内的所有标签, 使标签处于Ready状态。
2) 阅读器发送Request (all) 命令, 处于Ready状态的标签向阅读器发送其完整的UID, 此时阅读器接收到的数据为xxxx xxxx。
3) 由于接收到数据的最高碰撞在首位, 因此阅读器下发命令Call (, 1) , 所有收到命令的标签1~4 (1+3) 位做计算, 并向阅读器发送标签计算所得值。
4) 阅读器分析收到的数据x00x x0xx 0xx0 0x00, 分析知此时标签前三位UID值有8种情况, 0010 (0000 0000 0000 0100) , 0101 (00000000 0010 0000) , 0110 (0000 0000 0100 0000) , 1000 (0000 0001 00000000) , 1001 (0000 0010 0000 0000) , 1011 (0000 1000 0000 0000) , 1100 (0001 0000 0000 0000) , 1111 (1000 0000 0000 0000) 。阅读器发送Rq (0010) , 此时只有Tag6回复, 无碰撞, 正确识别Tag6。
5) 阅读器发送Rq (0101) , 此时只有Tag9回复, 无碰撞, 正确识别Tag9。
6) 阅读器发送Rq (0110) , 此时只有Tag8回复, 无碰撞, 正确识别Tag8。
7) 阅读器发送Rq (1000) , 此时只有Tag1回复, 无碰撞, 正确识别Tag1。
8) 阅读器发送Rq (1001) , 此时Tag4, Tag7, Tag10响应, 阅读器收到xxxx, 发生碰撞, 表示uid前4位为1001的标签不止一张, 需要继续寻呼标签的接下来的4位uid, 即5~8位uid才能识别本组标签。
9) 阅读器向标签发送Call (1001, 5) 表示:UID前4位为1001的标签将5~8 (5+3) 位做计算, 然后向阅读器发送标签计算所得值。
10) 阅读器分析收到的数据00x0 000x 0000 x000, 分析知此时前四位为1001的标签5~8位值有如下3种情况:0011 (0000 0000 0000 1000) , 1000 (0000 0001 0000 0000) , 1101 (00100000 0000 0000) 。阅读器发送Rq (1001 0011) , 此时只有Tag4回复, 无碰撞, 正确识别Tag4。
11) 阅读器发送Rq (1001 1000) , 此时只有Tag10回复, 无碰撞, 正确识别Tag10。
12) 阅读器发送Rq (1001 1101) , 此时只有Tag7回复, 无碰撞, 正确识别Tag7。
13) 阅读器发送Rq (1011) , 此时只有Tag5回复, 无碰撞, 正确识别Tag5。
14) 返回上一级阅读器发送Rq (1100) , 此时只有Tag2回复, 无碰撞, 正确识别Tag2。
15) 阅读器发送Rq (1111) , 此时只有Tag3回复, 无碰撞, 正确识别Tag3, 阅读器范围内所有标签识别完毕, 本次识别结束。
16) 使用Active () 命令激活标签进入下次识别。
改进算法具体实现标签的识别过程与结果如表4所示。
2.3 仿真结果以及分析
假设阅读器范围内有m个uid长度为n bit的标签。当标签收到Call命令时, 标签每次用k bit做计算, 存到长度为2kbi的buffer中。
由文献[4]可知, 对于返回二进制树算法, 要识别m (m>2) 个标签, 则阅读器需要寻呼次数为2×m-1次, 其中m-1次寻呼后收到的数据发生碰撞, m次寻呼后正确识别标签。
本文提出的算法, 根据每次碰撞时标签最高碰撞位接下来的k bit作为一组运算后, 发送阅读器, 阅读器按k位来寻呼, 而不是像返回二进制树算法以最高碰撞位 (即一位) 做寻呼。因此, 发生碰撞次数概率为返回二进制树算法的1/k, 但是改进的算法当发生碰撞时会产生一次额外的Call命令, 因此改进算法的寻呼次数为:
{根据上式可以得出rk与k成反比, 因此可以得出k越大, 算法在阅读器寻呼次数上优势越大。
下面针对改进算法的寻呼时间与返回二进制树算法的识别时间做推导, 算法的识别时间T与搜寻过程中需要传送的比特位呈正比, 因此此处仅对算法识别过程中传输的总bit位做推导, 而不考虑校验记录uid所需要的时间。假设改进的算法以及返回二进制树算法在一次搜寻过程中需要传输的总比特位分别为bitNBBS和bitBBS。
{根据上式可知bitNBBS与k (k≥2) 成正比因此, 虽然随着k的增加阅读器总寻呼次数减少, 但是需要传输的字节数却在增加。这是由于随着k的增加阅读器每次发送Call命令需要传输的字节数呈指数增加。不仅如此, 随着k的增加标签需要预留的buffer字节数也增加, 同时就增加了标签的硬件负担。给实际应用造成了困难, 因此, k值并不是越大越好。
结合实际考虑:由于标签uid长度普遍为2nbyte=8×2nbi (n≥0) , 如基于14443-A协议的标签uid长度为4 byte。在标签预留可供用户使用的寄存器大于两个字节时, 标签建议k值取4。因为, 当k=4时, 只需要使用标签的2字节的寄存器, 并且运算都是以移位运算为主, 不会给标签造成太大的负担, 同时效率也得到提高。但是, 当k>4时, 标签则要预留2k/8字节的寄存器, 例如k=5时, 则需要预留4字节;k=6时, 则需要预留8字节, 对标签负担就加重了。因此, 本文建议k取值为4。
以阅读器范围内标签个数为m个 (x轴) , 阅读器寻呼次数为y次 (y轴) , 标签长度n=8 bit, k=2, 3, 4反复运行10次求平均值。阅读器搜寻时间标签个数关系如图3所示。
注: (1) 返回二进制树算法; (2) k=2, 时改进算法; (3) k=3时, 改进算法; (4) k=4时, 改进算法
阅读器的搜寻时间直接决定算法的优劣, 从图3可以直观地看出随着标签个数的增加改进算法在识别时间上, 相对于其他两种改进的二进制树算法优势更加明显。由表5改进算法与其它两种二进制树算法搜寻时间比较表可以定量地看出改进算法在搜寻时间上的优势, 例如:在标签个数为250个时改进算法在k=4时相对于返回二进制树算法时间节省率将达到29.86%。
3 结语
本文首先对常用的改进二进制树简介, 然后提出了一种改进的二进制树算法, 该算法在动态二进制树算法的基础上通过阅读器发送命令让标签做计算, 并将计算所得值发送给阅读器, 通过标签返回的值, 阅读器清楚地知道标签的当前k (k=2, 3, 4, 在实际应用中建议取值为4) 位uid值, 从而减少阅读器的寻呼次数, 并最终减少了阅读器的搜寻时间。并通过仿真证明了, 改进算法相比于动态二进制树算法在阅读器寻呼次数上有所减少。相比于动态二进制树算法和跳跃类二进制树算法在阅读器寻呼时间上的优势。特别在标签数越多时算法的优势越明显, 但是本算法需要标签支持一个可供用户使用的一个字节的寄存器Buffer[], 相对来说就增加了标签的硬件负担。因此, 本算法适用于对算法识别速度要求高, 并且标签支持一个可供用户使用的一个字节的寄存器适的情况下的RFID系统下大规模标签的识别。
参考文献
[1]张航, 唐明浩, 程晖.改进的返回二进制防碰撞算法[J].计算机工程与应用, 2011, 47 (25) :208-211.
[2]夏志国, 何怡刚, 侯周国.一种二进制树位检测的标签防碰撞算法[J].计算机工程与应用, 2010, 46 (20) :245-248.
[3]Lee Suryun, Joo Sungdon, Lee Chaewoo.An Enhanced Dynamic Framed Slotted ALOHA Algorithm for RFID Tag Identification[C]//Proceeding of the 2nd Annual International Conference on Mobile and Ubiquitous Systems, 2005.
[4]徐圆圆, 曾隽芳, 刘禹.基于A loha算法的帧长及分组数改进研究[J].计算机应用, 2008, 28 (3) :588-590.
[5]Joe I, Lee J.A novel anti-collision algorithm with optimal frame size for RFID system[C]//Proc.of 5th IEEE International Conference on Software Engineering Research, Management and Applications, 2007:424-428.
[6]陶云聪.RFID系统多标签防碰撞算法研究[D].重庆:重庆大学, 2010.
[7]何晓桃, 郑文丰.RFID中基于二分叠加的二进制防碰撞算法[J].华南师范大学学报:自然科学版, 2011 (3) .
[8]张琦.基于TDMA的阅读器控制防碰撞算法研究[D].合肥:合肥工业大学, 2007.
退二进三 篇8
1 一般情况
一般情况下,HttpSendRequest API函数可以上传字符的字节数据到服务器端的缓冲区,再由服务器端程序的接收程序从缓冲区取出数据来使用。
将API函数在模块级中定义(仅定义HttpSendRequest函数,其它用到的API函数读者可参照定义):
以上代码解释如下:
(1)通过InternetOpen、InternetConnect、HttpOpenRequest、HttpAddRequestHeaders API函数和IIS服务器建立连接,具体体现在sUrl参数上。通过ASP文档调用dll自编程序库实现和服务器连接,服务器接收数据的程序就是放在自编的dll程序库中。
(2)用HttpSendRequest API函数上传数据:lpszPostData表示要上传的数据;lPostDataLen表示要上传数据的字节长度;h HttpOpenRequest是连接服务器的句柄。
(3)最后用InternetCloseHandle API函数一级一级的关闭Internet连接和URL句柄。如果上传成功返回真,否则返回假。
2 问题分析与解决
通过上面代码可以了解到数据上传的过程。但是,在实际应用过程中经常会出现上传文件不成功的情况。主要存在两个问题:
2.1 postdat参数传来的不是字符串
在上载文件时,无论文件大小,如果是二进制数据,都不能正确的把数据上载上去。虽然postdat参数可以给二进制数组,但经过lpszPostData=poststr$&"&FileStart="&postdata语句已自动将其转化为字符。而HttpSendRequest API函数将其上传时自动进行了编码转换即将字符串由Unicode转换为系统的缺省码,相当于使用StrConv(lpszPostData,vbFromU-nicode)函数,所以求上传字节长度的时候要用l PostDataLen=LenB(StrConv(lpszPostData,vbFromUnicode))语句,则传上去的字节数完全正确。
但是若上传的全部是有效字符,服务器端经过StrConv(Vs_DataBuffer,vbUnicode)转换就可提取出所有字符并全部是正确的。
若上传有二进制非有效字符数据时,如上例中:lpszPostData=poststr$&"&FileStart="&postdata,其中poststr$是有效字符,作用是给服务器怎样操作的信号数据,postdata是二进制数据经过转换的字符串数据(实际是转换成乱码),这些字符串数据也可以上传上去,但是再经过服务器端的StrConv(Vs_DataBuffer,vbUnicode)转换后就不是原来的二进制数据了,虽然字节数目完全相同,内容却已完全不同,若不经StrConv函数转换实际也不是源文件内容了,这是因为StrConv函数是不能对非有效字符进行转换的。
通过以上分析,可以看出HttpSendRequest API函数上传二进制数是有限制的,为了能实现上传二进制数据,避免单双字节编码转换对程序带来的影响,将HttpSendRequest API函数进行别名重定义如下:
不知道读者注意没有,上述代码中的HttpSendRequestByte API函数的声明已经改变了。第4个参数的声明由一个String字符串变成了一个Any的参数,这样就可以给第4个参数Byte数组了。
只是为了表单做温度计时控制温度计的运行速度和上载无关,可以不去理会。
而HttpSendRequest API语句的调用改为:
经过这样的改进即可达到上传二进制的目的。服务器端的接收程序也无需用StrConv(Vs_DataBuffer,vbUnicode)转换。这样我们就解决了第一个问题。
2.2 postdat的字节数不能大于50MB
上传大文件时由于数组的大小是长整型。传送、接收都要用到数组,所以超出长整型范围就会溢出。
若是大文件可以在调用时用循环的办法每次取出不超过50MB字节的数据调用之。调用程序如下:
此方法对2G的文件进行测试已可以准确无误的将文件上载存入服务器磁盘。
为读者更好理解,给出服务器端接收数据对应程序:
自编函数GetBinaryData的功能是防止传上来的二进制数据从缓冲区取出时由于过大出现错误。
在服务器端程序创建一个类模块编写下列代码:
注意:HttpSendRequest函数上传数据的参数是字符类型,接收数据时必须进行StrConv(Vs_DataBuffer,vbUnicode)转换。如果上传数据的参数是二进制数组则无需进行转换。
3 结语
退二进三 篇9
日本法务省201 1年1 1月11日推出年度《犯罪白皮书》,一组数字表明20岁以下的少年犯从“少年院”出来以后,大约有40%的人还会重新犯罪。迄今为止,这是日本第一次调查少年犯“二进宫”的情况,而这个“零”的突破,则从侧面印证了少年犯“二进宫”问题的日益严重。
日本法务省的研究机构对2004年1月到3月期间出狱的644名少年犯进行了追踪调查。他们当时的年龄都在18岁、19岁。结果他们当中有248人,在到25岁期间重新犯罪,接受了科处罚金以上的刑罚。其中有97人被判处实刑,有98人判刑后缓期执行,有53人被罚款。从“二进宫”的原因上看,盗窃者有73人,数量最多,伤害者有54人,吸毒者有25人,驾车伤人者等有22人。这里面还有一些人竟然是“三进宫”、“四进宫”。
在日本,成年人的标准年龄是20岁,此前都算是“少年”,中国则是18岁就算成年人。日本的少年犯走出监狱一少年院以后,一直到成年的20岁,原则上都必须与“保护司”等机构保持联系,接受“保护观察”。
在“二进宫”的人当中,没有职业的占48%。原因主要是经济景气低迷,全社会失业率都在增加,“好孩子”就业都不是一件容易的事情,“坏孩子”就更不容易就业了。其次,日本少年犯入狱期间的亲属探监次数与其后是否“二进宫”有着直接的关系。
退二进三 篇10
无线局域网协议是以IEEE 802.11[1]标准为基础的。该标准定义了一个信道接入控制 (MAC) 子层和3个物理 (PHY) 层。IEEE 802.11协议的目标是构建一个能够提供与有线网络类似服务的无线网络。但因带宽的有限性, 提高信道利用率就成为关键。
网络仿真技术[2], 即网络行为的模拟, 通过数学和统计方法建立模型 (包括网络设备、协议和链路) , 模拟网络中传输的数据, 获得网络优化设计时其性能数据的一种新技术。通过该技术可发现网络行为中出现的异常情况, 并对网络优化的可行性等进行验证。
相对于有线网络, WLAN中较高的误码率和“隐藏终端“ (Hidden Terminal) 等问题[7]是WLAN中常见的问题。此外, 一个站点为了能检测到冲突而不能够监听到它自己的传输, 在无限网络中, 难以进行载波监听[3]。本文在OPNET模拟仿真的基础上深入分析得出:利用RTS/CTS访问方式来解决“隐藏终端”问题;在活动节点数多且误码率高的情况下启用拆分门限功能。由于在在二进制退避算法 (binary backoff algorithm) 中, 竞争窗口在初始化时为一固定值。本文对二进制退避算法进行改进, 即计算时隙利用率来评估共享信道的竞争状况来动态调整竞争窗口的大小。通过仿真实验, 结果表明, 该算法能够有效降低网络负载和冲突, 并提高网络接入率。
1 DCF模式简介
DCF是IEEE 802.11M AC层协议中最重要与最基本的接入模式, 它采用CSMA/CA与二进指数退避机制来支持用户终端的异步数据通信。它试图让各个终端通过竞争来公平和高效的利用无线信道资源。RTS/CTS访问方式和基本访问方式是DCF的两种接入方式。
1.1 DCF的基本访问方式
在DCF方式中, 发送节点侦听到无线信道连续空闲时间达到DIFS后, 发送数据帧, 为了增强对异步业务传输的可靠性, DCF使用MAC层确认机制, 接收节点检验所收到的数据帧的循环冗余校验码 (CRC, Cyclic Redundancy Code) , 如果正确, 则在等待SIFS间隔后向发送节点发送一个ACK帧, 以表明已经成功的接收到该数据帧。如果在一定的时间内, 没有收到返回ACK帧, 发送节点就认为本次传输失败, 需要重传该数据帧。
1.2 DCF的RTS/CTS访问方式
“隐藏终端“ (Hidden Terminal) 在WLAN中经常出现, 为了解决这个问题, DCF利用RTS和CTS两个控制帧进行信道预留。RTS/CTS访问模式的具体过程可描述如下:
1) 在等待了DIFS (再加上随机退避时间) 后, 发送节点首先发送RTS控制帧。收到RTS的每个节点都根据持续时间域 (Duration Field) 来设置它的NAV (Network Allocation Vector) 。NAV制定了节点可以试图访问介质的最早时间点。
2) 如果传输数据的接收节点收到RTS, 在等待SIFS后, 需要进行应答, 通过CTS帧来实现。CTS帧也包括持续时间域, 而且所有接到这个CTS的节点必须再次调整他们的NAV。
3) 最后, 在SIFS间隔后, 发送节点可发送数据帧。接收节点在接收到数据帧后再等待SIFS间隔, 用ACK确认。
1.3 二进制退避算法
在MAC层协议中, 将重点考虑退避算法, 该算法在以下几方面具有重要作用:节点数据发送冲突分解效果较好;节点公平的接入到网络以及信道利用率的提高等等。网络中任一节点在发送数据过程中发生冲突, 将等待一定的时延后继续发送, 其中时延通常是指数增长, 一直增加到退避时间间隔的最大值CWmax;相反, 若节点数据顺利发送, 未发生冲突, 退避时间间隔将达到最小CWmin。二进制退避算法描述如下:
Step 1网络中节点先要确定信道的状态 (忙或闲) , 在进行发送数据, 通过调用载波监听机制进行判断, 在信道状态闲时, 发送数据;若为忙状态, 将继续监听, 直到闲状态才继续发送数据。
Step 2信道为闲状态时, 同时满足以下条件, 即连续空闲时间为DIFS长度, 进行向目的节点发生数据。节点数据发送过程中, 并不马上发生, 而是增加一个退避过程, 起到避免冲突发生的作用。
退避时间 (Backoff Time) 随机产生, 在退避计数器中存入产生得随机Backoff Time。Backoff Time由下面的公式1计算得到。Backoff Time产生的过程与计数器中是否有值相关, 若存在一个非零值, 将不会产生随机退避时间。
其中, Random () 是随机整数, 均匀分布在
[0, CW]范围内, CW (Contention Window) 竞争窗口为一整数值, 满足条件CWmin<=CW<=CWmax, CWmin为最小竞争窗口, CWmax最大竞争窗口, aSlotTime[3]表示一个时隙的实际长度。
Step 3网络中一个节点执行退避过程时, 如果侦听到信道空闲时间达到一个时隙, 则将Backoff Time计数器减1;若信道处于忙状态, Backoff Time计数器将处于冻结状态, 退避过程因而将会停止, 等到侦听信道状态再次为空闲, 进行进行退避过程, 计数器继续-1。该节点在计数器值递减到零时, 进行数据发送。标准IEEE802.11协议的实现详见4.3节的进程模型。
2 自适应二进制退避算法[4,5]
由上面的分析可以得出:
1) 网络中的节点发送数据产生冲突的概率随着节点数的增加而增加, 随之也会影响CW, 也会增大。在DCF的协议中, CW一般都是从由物理层决定的CWmin, 并且增加方式按照指数形式增加。当网络节点数多的情况下发送数据帧时, 冲突次数增加, 将会在一定程度上浪费无线信道, 造成节点所在网络性能的降低。因此, 需要对上述提到的指数增长方式进行适当修改。
2) 同时, 根据标准DCF协议, 网络节点数据重发次数达到上限或成功后, 设置CW=CWmin。因为网络节点数据的成功发送并不能认为网络节点间的冲突概率已经最小, 或者冲突概率减小, CW重置为最小的机制将不在适用。鉴于此, 提出了CW的慢递减机制, 即网络节点数据发送成功后修改CW的重置机制。此外, 还可以通过对不同等级的业务, CW按不同的算法增长或递减, 从而能够实现提供不同优先级的服务, 将会提高网络运行的性能。
3) CW介于CWmin和CWmax之间, 节点发送数据发生冲突时, CW将一直朝着CWmax以指数形式增加。标准DCF中是CW固定的, 跳频方式CWmin为15, 直接序列扩频方式为31。
网络中节点少, 需要进行长时间的等待过程, 而当节点数增加时, 节点发送数据产生传统的概率也随着增多, 进而影响WLAN的性能。可以得出CW与网络中的节点数存在一定的关系。因而, 为了使WLAN的性能达到最优, 初始化CW值的设置需要针对网络中的节点数的多少进行适当调整。
基于上述分析, 本文提出了自适应退避机制, 其核心思想是:利用计算时隙利用率来评估共享信道的竞争状况, 从而解决上面提到的问题。当检测到竞争水平高时, 这表明如果一个站点发送一个数据包就会产生碰撞。此时, 该算法就会触发一个虚拟碰撞过程并且扮演着退避角色, 以此来代替发送一个数据包。这样, 碰撞就有可能避免, 可以提高无线信道的利用率、网络的吞吐率以及网络的公平性。在标准IEEE802.11协议的基础上, 增加PT_BACKOFF和PT_TEST状态, 改进算法如下:
有限状态机PT_BACKOFF状态:
有限状态机PT_TEST状态:
有限状态机BKOFF_NEEDED状态:
3 自适应退避算法仿真
OPNET[6,7]提供了良好的开发接口, 能够根据网络环境和协议的需要建造不同的仿真模型, 其仿真模型分三层来实现, 从上到下分别为:网络层、节点层和进程模型。网络层, 反映网络拓扑结构;由相应的协议模型构成的节点层, 反映设备特性;进程模型以有限状态机来描述。仿真模型和实际的网络、设备、协议一一对应, 网络相关特性也被全面反映。
3.1 建立网络模型
本文建立了图1的独立基本服务子集[7]的网络模型, 用于比较二进制退避算法和自适应退避算法。
3.2 建立节点模型
Wlan_wkstn节点由source、sink、wlan_mak_intf及wireless_lan_mac四个处理器组成。引用的进程模型分别为bursty_source、sink、wlan_mac_interface、wlan_mac。其中wlan_mac进程对应的源文件是wlan_mac_pr.c。该模块结构简单, 仅包含3层, 顶层的source和sink概括了OSI的网络层以上的部分, 这为单独研究MAC层提供了极大的方便。
3.3 建立进程模型
根据IEEE802.11协议的二进制退避机制, 共设计了9个有限状态机以完成网络架构、DCF模式下的CSMA/CA信道竞争机制以及RTS/CTS的协调功能等, 有限状态机如图2所示。
3.4 自适应退避算法仿真结果及分析
修改wlan_mac.pr.c文件后, 构建自组织网络架构, 站点分别为10、22、60个, 其他参数设置如表1所示。
仿真结果如图3所示。
仿真结果表明:随着活动节点数由10、22到60个的增加, 发送数据的冲突概率在增大, 这时需要较大的初始化活动窗口, 自适应改进算法中CCW=CWmin*2+1, 这是根据信道的利用率来一次调整就可以完成数据的发送, 而DCF规定竞争窗口只能从最小值以指数形式增大, 节点需要几次冲突后才能发送数据, 这样明显的降低了网络负载;标准DCF协议规定, 发送成功或达到重传次数限制后, 将CW重置为CWmin, 然而一次成功传送并不能断定网络中的冲突概率已经减小, 所以不应该将重置为最小, 而自适应改进算法是根据信道利用率以及CCW的大小来判断是否重置CW, 这样可以降低接入延时。
图3 (a) 表明, 自适应退避算法较标准的二进制退避算法在网络负载降低大约20%;活动节点数的增加至22个, 见图3 (b) , 负载降低大约30%;活动节点数的增加至60个, 见图3 (c) , 负载降低大约50%。由此可见自适应退避算法较标准二进制退避算法降低了网络负载。
4 结束语
通过对IEEE802.11协议在OPNET上的仿真实现, 分析对比各种参数对网络性能的影响, 可以得出以下结论:1) 采用自适应退避算法, 能够有效的降低冲突, 具有一定的应用价值;2) OPNET在网络优化、协议验证、设备优化升级等方面为我们提供方便, 当前针对OPNET的研究还较少, 对网络仿真的方法有一定的探索和实践意义。
参考文献
[1]IEEE Standard forW irelessLANMedium Access Control (MAC) and Physical Layer (PHY) Specifications[Z].ANSI/IEEE STD802.11, 1999Edition, New York, 1999.
[2]王文博.OPNETModeler与网络仿真[M].北京:人民邮电出版社, 2003.
[3]L.Bononi, M.Conti, and L.Donatiello, “Design and performance evaluation of a distributed contention control (DCC) mechanism for IEEE802.11wireless local area networks, ”in Proceedings of First ACM International Workshop on Wireless Mobile Multimedia, 1998, 10:59-67.
[4]OPNET Technologies, Inc., “Wireless LAN model deccription, ”http://www.opnet.com/products/library/WLAN_Model_Guide1.pdf.
[5]F.Cali, M.Conti, and E.Gregori, “Dynamic tuning of the IEEE802.11protocol to achieve a theoretical throughput limit, ”IEEE/ACM Transactions on Networking, 2000, 8 (6) :785-799.
[6]陈敏.OPNET网络仿真[M].北京:清华大学出版社, 2004.
做一个二进制解码器 篇11
● 纸牌解码器
先从一个纸牌游戏开始,取扑克牌若干,正面朝上代表数码1,背面朝上代表数码0,如果将要解码的二进制数字是“10”,则将扑克牌以正面朝上和背面朝上两两搭配为一组,并将这个模式重复四次,也就是“正反正反正反正反”八张牌。然后背诵“咒语”——翻翻翻留留翻留留,其中“翻”代表把牌翻个面,“留”代表不翻面。前两张牌称为第零组,次两张牌称为第一组,再次两张为第二组,最后两张为第三组。翻牌前初始状态如图1所示。
根据“咒语”翻面后,就成了图2所示的状态。
可以看出,第零组是一背一正,第一组全是背面,第二组全是正面,第三组是一正一背。全是正面的那一组是第二组,而二进制数“10”所对应的十进制数恰好就是2。
再举一个例子,二进制数“11”可用两张朝上的牌来代表,先将这个模式重复四次(如图3)。
然后根据“翻翻翻留留翻留留”的“咒语”翻牌,得到图4所示的状态。
可见解码后的数字是3,因为只有第三组两张都是正面。其余的情况,大家可以自己试一下。
● 纸板解码器
根据以上原理再进一步,可以设计出更精巧的纸板解码器(如上页图5)。
按图样剪两张纸板,两边伸出两个“小耳朵”,“小耳朵”一面写“0”,翻过来另一面写“1”。另外,再剪一张矩形纸板作为底板,标上“0”“1”“2”“3”四个十进制数字作为输出。然后将有“小耳朵”的两张纸板叠在底板上,露出的缺口恰好可以显示一个十进制数(如上页图6)。
两张都是正面,叠在一起则表示输入为“00”,输出为“0”。上页图7分别是“01”得“1”、“10”得“2”和“11”得“3”的情况。
关于二进制中位数函数均值的计算 篇12
在文献[1]中美国数论专家F.Smarandache教授提出了105个未解决的问题让大家研究,其中有5个问题是关于自然数列性质的问题。文献[2]主要研究了数字之积函数的均值,文献[3,4]分别给出了一个正整数在二进制表示中数字之和函数以及它的一次、二次、三次均值的精确计算公式。这里主要采用归纳、猜想的方法研究自然数列的位数函数,得出了一个正整数在二进制表示中的位数函数a(m,n)的均值Ak(m,n)(k=1,2,3)的精确计算公式,并给予了证明。
定义1:对任一正整数m,假定m在二进制中表示为m=a0+a12+a222+…+as2s其中,0≤ai<2,i=1,2,…,s,as≠0,记a(m,2)=s+1,称a(m,2)为m的位数函数,Ak(N,2)为位数函数a(m,2)的k次均值,且
定理1:设N=a0+a121+a222+…+as2s其中 0≤ai<2, i=1,2,…,s。
则
定理2:设N=a0+a121+a222+…+as2s其中 0≤ai<2, i=1,2,…,s。
定理3:设N=a0+a121+a222+…+as2s其中 0≤ai<2, i=1,2,…,s。
2引理及其证明
为了证明定理,首先引入下面6个引理。
2.1引理1 设k为自然数,则:
当k=1时,左边
假设k=p时命题成立,即
由假设(2)得
所以 当k=p+1时成立,
命题对任意自然数k都成立。
2.2引理2
(3)式中,b为正整数.
因为
由式(1),式(4),式(5)得
2.3引理3 设k为自然数,则:
当 k=0,1时,命题显然成立。
假设k=p时, 命题显然成立,即
当k=p+1时
2A2(2p,2)+2A1(2p,2)+2p(8)
将式(1),式(7),代入式(8)得
所以命题对于任意自然数k都成立。
2.4引理4 设k为自然数,
将式(1),式(6)代入式(9)得
2.5引理5 设k为自然数,
当k=0时,命题显然成立。
当k=1时 左边=
右边=1 命题成立。
假设k=p时命题成立,即
则当k=p+1时
2A3(2p,2)+3A2(2p,2)+3A1(2p,2)+np(12)
将式(1)式、(6)式、(11)代入式(12)得
所以命题对于任意自然数k都成立。
2.6引理6 设k为自然数
A3(b2k,2)=[((3k2+1)(b-1)+k(4b-3))23+(kb(k2-9k+1)+6k2)22+k(k-1)×(10b-2kb-3)2+bk(k-1)(k-5)]2k-3(13)
bA3(2k,2)+3(b-1)A2(2k,2)+3(b-1)A1(2k,2)+(b-1)2k(14)
将式(1)、式(6)、式(10)代入式(14)得
A3(b2k,2)=[((3k2+1)(b-1)+k(4b-3))×23+(kb(k2-9k+1)+6k2)22+k(k-1)(10b-2kb-3)2+bk(k-1)(k-5)]2k-3。
3定理的证明
3.1定理1的证明
则有
将式(3)代入式(15)得
于是完成了定理1的证明。
3.2定理2的证明
将引理2和引理4代入上式得
于是完成了定理2的证明。
3.3定理3的证明
将引理2,引理4,引理6代入上式得
于是完成了定理3的证明。
参考文献
[1]Smarandche F.Only problems,not solutions!Xiquan Publishing House,1993
[2]杨倩丽,李海龙.关于n进制中数字之和函数均值的计算.西北大学学报,2002;10(4):361—362
[3]李海龙,杨倩丽.n进制中非零数字之积函数的均值公式.数学的实践与认识,2002;32(4):683—686
【退二进三】推荐阅读: