??xml version="1.0" encoding="utf-8" standalone="yes"?>
在传l上Q我们有几种Ҏ来加密数据流。所有这些方法都可以用Y件很Ҏ的实玎ͼ但是当我们只知道密文的时候,是不Ҏ破译q些加密法的(当同时有原文和密文时Q破译加密算法虽然也不是很容易,但已l是可能的了Q。最好的加密法对系l性能几乎没有影响Qƈ且还可以带来其他内在的优炏V例如,大家都知道的PKZIPQ它既压~数据又加密数据。又如,DBMS的一些Y件包L包含一些加密方法以使复制文件这一功能对一些敏感数据是无效的,或者需要用L密码。所有这些加密算法都要有高效的加密和解密能力?
q运的是Q在所有的加密法中最单的一U就是“置换表”算法,q种法也能很好辑ֈ加密的需要。每一个数据段QL一个字节)对应着“置换表”中的一个偏U量Q偏U量所对应的值就输出成ؓ加密后的文g。加密程序和解密E序都需要一个这L“置换表”。事实上Q?0x86 CPUpd有一个指令‘XLAT’在gU来完成q样的工作。这U加密算法比较简单,加密解密速度都很快,但是一旦这个“置换表”被Ҏ获得Q那q个加密Ҏ完全被识破了。更q一步讲Q这U加密算法对于黑客破译来讲是相当直接的,只要扑ֈ一个“置换表”就可以了。这U方法在计算机出C前就已经被广泛的使用?
对这U“置换表”方式的一个改q就是?个或者更多的“置换表”,q些表都是基于数据流中字节的位置的,或者基于数据流本n。这Ӟ破译变的更加困难Q因为黑客必L的做几ơ变换。通过使用更多的“置换表”,q且按伪随机的方式用每个表Q这U改q的加密Ҏ已经变的很难破译。比如,我们可以Ҏ有的偶数位置的数据用A表,Ҏ有的奇数位置使用B表,即黑客获得了明文和密文Q他想破译这个加密方案也是非常困隄Q除非黑客确切的知道用了两张表?
与用“置换表”相cMQ“变换数据位|”也在计机加密中用。但是,q需要更多的执行旉。从输入中读入明文放C个buffer中,再在buffer中对他们重排序,然后按这个顺序再输出。解密程序按相反的顺序还原数据。这U方法L和一些别的加密算法合用,q就使得破译变的特别的困难,几乎有些不可能了。例如,有这样一个词Q变换v字母的顺序,slient 可以变ؓlistenQ但所有的字母都没有变化,没有增加也没有减,但是字母之间的顺序已l变化了?
但是Q还有一U更好的加密法Q只有计机可以做,是?字节循环UM和XOR操作。如果我们把一个字或字节在一个数据流内做循环UMQ用多个或变化的方向(左移或右U)Q就可以q速的产生一个加密的数据。这U方法是很好的,破译它就更加困难Q而且Q更q一步的是,如果再用XOR操作Q按位做异或操作Q就׃破译密码更加困难了。如果再使用伪随机的ҎQ这涉及到要产生一pd的数字,我们可以使用Fibbonaci数列。对数列所产生的数做模q算Q例如模3Q,得到一个结果,然后循环UMq个l果的次敎ͼ破译ơ密码变的几乎不可能Q但是,使用Fibbonaci数列q种伪随机的方式所产生的密码对我们的解密程序来讲是非常Ҏ的?
在一些情况下Q我们想能够知道数据是否已经被篡改了或被破坏了,q时需要生一些校验码Qƈ且把q些校验码插入到数据中。这样做Ҏ据的防伪与程序本w都是有好处的。但是感染计机E序的病毒才不会在意q些数据或程序是否加q密Q是否有数字{。所以,加密E序在每ơload到内存要开始执行时Q都要检查一下本w是否被病毒感染Q对与需要加、解密的文g都要做这U检查!很自Ӟq样一U方法体制应该保密的Q因为病毒程序的~写者将会利用这些来破坏别h的程序或数据。因此,在一些反病毒或杀病毒软g中一定要使用加密技术?
循环冗余校验是一U典型的校验数据的方法。对于每一个数据块Q它使用位@环移位和XOR操作来生一?6位或32位的校验?Q这使得丢失一位或两个位的错误一定会D校验和出错。这U方式很久以来就应用于文件的传输Q例?XMODEM-CRC?q是Ҏ已经成ؓ标准Q而且有详l的文档。但是,Z标准CRC法的一U修改算法对于发现加密数据块中的错误和文件是否被病毒感染是很有效的?
二.Z公钥的加密算?
一个好的加密算法的重要特点之一是具有这U能力:可以指定一个密码或密钥Qƈ用它来加密明文,不同的密码或密钥产生不同的密文。这又分ZU方式:对称密钥法和非对称密钥法。所谓对U密钥算法就是加密解密都使用相同的密钥,非对U密钥算法就是加密解密用不同的密钥。非常著名的PGP公钥加密以及RSA加密Ҏ都是非对U加密算法。加密密钥,卛_钥,与解密密钥,即私钥,是非常的不同的。从数学理论上讲Q几乎没有真正不可逆的法存在。例如,对于一个输入‘a’执行一个操作得到结果‘b?那么我们可以Z‘b’,做一个相对应的操作,导出输入‘a’。在一些情况下Q对于每一U操作,我们可以得到一个确定的|或者该操作没有定义Q比如,除数?Q。对于一个没有定义的操作来讲Q基于加密算法,可以成功地防止把一个公钥变换成为私钥。因此,要想破译非对U加密算法,扑ֈ那个唯一的密钥,唯一的方法只能是反复的试验,而这需要大量的处理旉?
RSA加密法使用了两个非常大的素数来产生公钥和私钥。即使从一个公钥中通过因数分解可以得到U钥Q但q个q算所包含的计量是非常巨大的Q以至于在现实上是不可行的。加密算法本w也是很慢的Q这使得使用RSA法加密大量的数据变的有些不可行。这׃得一些现实中加密法都基于RSA加密法。PGP法(以及大多数基于RSA法的加密方?使用公钥来加密一个对U加密算法的密钥Q然后再利用一个快速的对称加密法来加密数据。这个对U算法的密钥是随Z生的Q是保密的,因此Q得到这个密钥的唯一Ҏ是使用U钥来解密?
我们举一个例子:假定现在要加密一些数据用密钥?2345’。利用RSA公钥Q用RSA法加密q个密钥?2345’,q把它放在要加密的数据的前面Q可能后面跟着一个分割符或文仉度,以区分数据和密钥Q,然后Q用对U加密算法加密正文,使用的密钥就是?2345’。当Ҏ收到Ӟ解密E序扑ֈ加密q的密钥Qƈ利用RSAU钥解密出来Q然后再定出数据的开始位|,利用密钥?2345’来解密数据。这样就使得一个可靠的l过高效加密的数据安全地传输和解密?
一些简单的ZRSA法的加密算法可在下面的站点扑ֈQ?
ftp://ftp.funet.fi/pub/crypt/cryptography/asymmetric/rsa
三.一个崭新的多步加密法
现在又出C一U新的加密算法,据说是几乎不可能被破译的。这个算法在1998q??日才正式公布的。下面详l的介绍q个法:
使用一pd的数字(比如?28位密钥)Q来产生一个可重复的但高度随机化的伪随机的数字的序列。一ơ?56个表,使用随机数序列来产生密码转表Q如下所C:
?56个随机数攑֜一个距阵中Q然后对他们q行排序Q用这样一U方式(我们要记住最初的位置Q用最初的位置来生一个表Q随意排序的表,表中的数字在0?55之间。如果不是很明白如何来做Q就可以不管它。但是,下面也提供了一些原码(在下面)是我们明白是如何来做的。现在,产生了一个具体的256字节的表。让q个随机C生器接着来生这个表中的其余的数Q以至于每个表是不同的。下一步,使用"shotgun technique"技术来产生解码表。基本上_如果 a映射到bQ那么b一定可以映到aQ所以b[a[n]] = n.Qn是一个在0?55之间的数Q。在一个@环中赋|使用一?56字节的解码表它对应于我们刚才在上一步生的256字节的加密表?
使用q个ҎQ已l可以生这L一个表Q表的顺序是随机Q所以生这256个字节的随机C用的是二ơ伪随机,使用了两个额外的16位的密码.现在Q已l有了两张{换表Q基本的加密解密是如下这样工作的。前一个字节密文是q个256字节的表的烦引。或者,Z提高加密效果Q可以用多?位的|甚至使用校验和或者CRC法来生烦引字节。假定这个表?56*256的数l?会是下面的样子:
crypto1 = a[crypto0][value]
变量""crypto1""是加密后的数据,""crypto0""是前一个加密数据(或着是前面几个加密数据的一个函数|。很自然的,W一个数据需要一个“种子”,q个“种子?是我们必记住的。如果?56*256的表Q这样做会增加密文的长度。或者,可以使用你生出随机数序列所用的密码Q也可能是它的CRC校验和。顺便提及的是曾作过q样一个测? 使用16个字节来产生表的索引,?28位的密钥作ؓq?6个字节的初始?U子"。然后,在生出q些随机数的表之后,可以用来加密数据,速度辑ֈ每秒?00k个字节。一定要保证在加密与解密旉使用加密的g的烦引,而且q两ơ一定要匚w?
加密时所产生的伪随机序列是很随意的,可以设计成想要的M序列。没有关于这个随机序列的详细的信息,解密密文是不现实的。例如:一些ASCII码的序列Q如“eeeeeeee"可能被{化成一些随机的没有M意义的ؕ码,每一个字节都依赖于其前一个字节的密文Q而不是实际的倹{对于Q一个单个的字符的这U变换来_隐藏了加密数据的有效的真正的长度?
如果实不理解如何来产生一个随机数序列Q就考虑FIBBONACCI数列Q?个双字(64位)的数作ؓ产生随机数的U子Q再加上W三个双字来做XOR操作?q个法产生了一pd的随机数。算法如下:
unsigned long dw1, dw2, dw3, dwMask;
int i1;
unsigned long aRandom[256];
dw1 = {seed #1};
dw2 = {seed #2};
dwMask = {seed #3};
// this gives you 3 32-bit "seeds", or 96 bits total
for(i1=0; i1 < 256; i1++)
{
dw3 = (dw1 + dw2) ^ dwMask;
aRandom[i1] = dw3;
dw1 = dw2;
dw2 = dw3;
}
如果想生一pd的随机数字,比如_?和列表中所有的随机C间的一些数Q就可以使用下面的方法:
int __cdecl MySortProc(void *p1, void *p2)
{
unsigned long **pp1 = (unsigned long **)p1;
unsigned long **pp2 = (unsigned long **)p2;
if(**pp1 < **pp2)
return(-1);
else if(**pp1 > *pp2)
return(1);
return(0);
}
...
int i1;
unsigned long *apRandom[256];
unsigned long aRandom[256]; // same array as before, in this case
int aResult[256]; // results go here
for(i1=0; i1 < 256; i1++)
{
apRandom[i1] = aRandom + i1;
}
// now sort it
qsort(apRandom, 256, sizeof(*apRandom), MySortProc);
// final step - offsets for pointers are placed into output array
for(i1=0; i1 < 256; i1++)
{
aResult[i1] = (int)(apRandom[i1] - aRandom);
}
...
变量""aResult""中的值应该是一个排q序的唯一的一pd的整数的数组Q整数的值的范围均在0?55之间。这样一个数l是非常有用的,例如Q对一个字节对字节的{换表Q就可以很容易ƈ且非常可靠的来生一个短的密钥(l常作ؓ一些随机数的种子)。这样一个表q有其他的用处,比如_来生一个随机的字符Q计机游戏中一个物体的随机的位|等{。上面的例子其本n而言q没有构成一个加密算法,只是加密法一个组成部分?
作ؓ一个测试,开发了一个应用程序来试上面所描述的加密算法。程序本w都l过了几ơ的优化和修改,来提高随机数的真正的随机性和防止会生一些短的可重复的用于加密的随机数。用q个E序来加密一个文Ӟ破解q个文g可能会需要非常巨大的旉以至于在现实上是不可能的?
四.l论Q?
׃在现实生zMQ我们要保一些敏感的数据只能被有相应权限的h看到Q要保信息在传输的q程中不会被改Q截取,q就需要很多的安全pȝ大量的应用于政府、大公司以及个hpȝ。数据加密是肯定可以被破解的Q但我们所惌的是一个特定时期的安全Q也是_密文的破解应该是_的困难,在现实上是不可能的,其是短旉内?
]]>
DES是Data Encryption StandardQ数据加密标准)的羃写。它是由IBM公司研制的一U加密算法,国国家标准局?977q公布把它作为非部门使用的数据加密标准,二十q来Q它一直活跃在国际保密通信的舞CQ扮演了十分重要的角色[10]?br /> DES是一个分l加密算法,他以64位ؓ分组Ҏ据加密。同时DES也是一个对U算法:加密和解密用的是同一个算法。它的密匙长度是56位(因ؓ每个W?位都用作奇偶校验Q,密匙可以是Q意的56位的敎ͼ而且可以L时候改变。其中有极少量的数被认ؓ是弱密匙Q但是很Ҏ避开他们。所以保密性依赖于密钥?br /> 2 法框架[11]Q?br /> DES?4(bit)位的明文分组Mq行操作QMl过一个初始置换IP|换成m0Q将m0明文分成左半部分和右半部分m0=(L0,R0)Q各32位长。然后进?6轮完全相同的q算Q这些运被UCؓ函数fQ在q算q程中数据与密匙l合。经q?6轮后Q左Q右半部分合在一Lq一个末|换Q这样就完成了[12]?br /> 在每一轮中Q密匙位UMQ然后再从密匙的56位中选出48位。通过一个扩展置换将数据的右半部分扩展成48位,q过一个异或操作替代成新的32位数据,在将其置换换一ơ。这四步q算构成了函数f。然后,通过另一个异或运,函数f的输Z左半部分l合Q其l果成ؓ新的叛_部分Q原来的叛_部分成ؓ新的左半部分。将该操作重?6ơ,实C。具体图4所C?br />
? DES法框图 3 DES解密
在经q所有的代替、置换、异或盒循环之后Q你也许认ؓ解密法与加密算法完全不同。恰恰相反,l过_ֿ选择的各U操作,获得了一个非常有用的性质Q加密和解密使用相同的算法?br />DES加密和解密唯一的不同是密匙的次序相反。如果各轮加密密匙分别是K1,K2,K3?K16那么解密密匙是K16,K15,K14…K1?br /> 4 DES的几U工作方?/font>
W一U电子密本方式(ECBQ?/font>
明文分成n?4比特分组Q如果明文长度不?4比特的倍数Q则在明文末֡充适当数目的规定符受对明文l用l定的密钥分别进行加密,行密文C=(C0,C1,…?Cn-1)其中Ci=DES(K,xi),i=0,1,?.,n-1?br /> W二U密文分l链接方式(CBCQ?/font>
在CBC方式下,每个明文lxi在加密前与先一l密文按位模二加后,再送到DES加密QCBC方式克服了ECB方式报内l重的缺点,但由于明文组加密前与一l密文有养I因此前一l密文的错误会传播到下一l?br /> W三U密文反馈方式(CFBQ,可用于序列密?/font>
明文XQ?x0,x1,…?xn-1)Q其中xi由t个比特组?
与CFB唯一不同的是OFB是直接取DES输出的t个比特,而不是取密文的t个比特,其余都与CFB相同。但它取的是DES的输出,所以它克服了CFB的密文错误传播的~点
]]>
性标准RS-485作ؓ一U多炏V差分数据传输的甉|规范现已成ؓ业界应用最为广泛的标准通信接口之一。这U通信接口允许在简单的一对双l线上进行多炏V双向通信、它所h的噪声抑制能力、数据传输速率、电~长度及可靠性是其他标准无法比拟的。正因ؓ此,许多不同领域都采用RS-485作ؓ数据传输链\。例如汽车电子、电信设备、局域网、蜂H基站、工业控制、A器A表等{。这Ҏ准得到广泛接受的另外一个原因是它的通用性。RS-485标准只对接口的电气特性做定,而不涉及接插件、电~或协议Q在此基上用户可以徏立自q高层通信协议?/FONT>
管RS-485标准已被q泛接受Q但是对于它在实际应用中的一些具体问题ƈ没有得到深入q泛的认识,甚至存在着U种误区Q以至于影响到整个系l的性能。本文在回顾RS-485标准的基上,重点讨论几个实际应用中常被忽视的问题?/FONT>
RS-485标准回顾
RS-485标准最初由电子工业协会QEIAQ于1983q制订ƈ发布Q后由TIA-通讯工业协会修订后命名ؓTIA/EIA-485-AQ不q工E师q是习惯地称之ؓRS-485。RS-485由RS-422发展而来Q后者是为I补RS-232之不提出的。ؓ改进RS-232通信距离短、速率低的~点QRS-422定义了一U^衡通信接口Q将传输速率提高?0MbpsQ传输距dg长到4000英尺Q速率低于100kbpsӞQƈ允许在一条^衡线上连接最?0个接收器。RS-422是一U单机发送、多机接收的单向、^衡传输规范,为扩展应用范_随后又ؓ其增加了多点、双向通信能力Q即允许多个发送器q接到同一条ȝ上,同时增加了发送器的驱动能力和冲突保护Ҏ,扩展了ȝ共模范围Q这是后来的EIA RS-485标准?/FONT>
RS-485是一个电气接口规范,它只规定了^衡驱动器和接收器的电Ҏ,而没有规定接插g、传输电~和通信协议。RS-485标准定义了一个基于单对^衡线的多炏V双向(半双工)通信链\Q是一U极为经、ƈh相当高噪声抑制、传输速率、传输距d宽共模范围的通信q_。RS-485接口的主要特点如下:
|络配置
RS-485支持半双工或全双工模式,|络拓扑一般采用终端匹配的ȝ型结构,不支持环形或星Ş|络。最好采用一条ȝ各个节点串接v来,从ȝ到每个节点的引出UK度应量短,以便使引出线中的反射信号Ҏȝ信号的媄响最低。图1所CZؓ实际应用中常见的一些错误连接方式(aQcQeQ和正确的连接方式(bQdQfQ。aQcQe三种不恰当的|络q接管在某些情况下Q短距离、低速率Q仍然可以正常工作,但随着通信距离的g长或通信速率的提高,其不良媄响会来严重,主要原因是信号在各支路末端反后与原信号叠加Q造成信号质量下降。除此之外还应注意ȝҎ阻抗的q箋性,在阻抗不q箋点也会发生信L反射。例如,ȝ的不同区D采用不同电~、某一D|ȝ上有q多收发器紧靠在一起安装、或者是有过长分支线引出ȝ旉会出现阻抗不q箋炏VMQ应该提供一条单一、连l的信号通道作ؓȝ?/FONT>
?:几种错误的网l连接方式及正确的方?/FONT>
有关ȝ上允许连接的收发器数标准q没有做定,但规定了最大ȝ负蝲?2个单位负载(ULQ。每单位负蝲的最大输入电ؓ1.0mA/-0.8mAQ相当于U?2kΩ。ؓ了扩展ȝ节点敎ͼ器g生厂商增大收发器输入电阅R例如MAX487QMAX1487的输入电d加至48kΩ以上Q?/4ULQ,节点数就可增加至128个,96kΩ输入电阻的MAX1483允许节点数可?56个?/FONT>
ȝ匚w
是否对RS-485ȝq行l端匚w取决于数据传输速率、电~长度及信号转换速率。UART是在每个数据位的中点采样数据的,只要反射信号在开始采h衰减到够低可以不考虑匚w。有一条经验性的准则可以用来判断在什么样的数据速率和电~长度时需要进行匹配:当信L转换旉Q上升或下降旉Q超q电信号沿ȝ单向传输所需旉?倍以上时可以不加匹配。例如具有限斜率Ҏ的RS-485接口MAX483输出信号的上升或下降旉最ؓ250nsQ典型双l线上的信号传输速率Uؓ0.2m/nsQ?4AWG PVC늼Q,那么只要数据速率?50kbps以内、电~长度不过16cI采用MAX483作ؓRS-485接口时就可以不加l端匚w?/FONT>
当考虑l端匚wӞ有多U匹配方案可以选择。最单的是在ȝ两端各接一只阻值等于电~特性阻抗的电阻Q图2aQ。大多数双绞U特性阻抗大U在100Ω?20Ω之间。这U匹配方法简单有效,但有一个缺点,匚w电阻要消耗较大功率,对于功耗限制比较严格的pȝ不太适合。另外一U比较省늚匚w方式是RC匚wQ图2bQ。利用一只电容C隔断直流成分可以节省大部分功率。但电容C的取值是个难点,需要在功耗和匚w质量间进行折街除上述两种外,q有一U采用二极管的匹配方案(?cQ。这U方案虽未实现真正的"匚w"Q但它利用二极管的钳位作用迅速削弱反信P辑ֈ改善信号质量的目的。节能效果显著?/FONT>
?Q几U终端匹配方?/FONT>
引出U?/B>
RS-485ȝ上的每个收发器通过一D引出线接入ȝQ引出线q长Ӟ׃信号在引出线中的反射Q也会媄响ȝ上的信号质量。和前面的讨ZPpȝ所能允许的引出UK度也和信L转换旉、数据速率有关。下面的l验公式可以用来估算引出U的最大长度:
Lmax=QtRISE×0.2m/nsQ?10
以MAX483ZQ对应于250ns的上?下降旉Qȝ允许的最大引出线长度Uؓ5c?/FONT>
从以上的分析可以看出Q减~信L前后沿斜率有利于降低对于ȝ匚w、引出线长度的要求,改善信号质量Q同Ӟq信号中的高频成分降低Q减电辐,因此Q有些器件生产厂商在RS-485接口器g中增加了摆率限制电\来减~信号前后沿Q但q种做法也限制了数据传输速率。由此看来,在选择接口器gӞq不是速率高好Q应该根据系l要求,选择最低速率的器件?/FONT>
失效保护
RS-485标准规定接收器门限ؓu200mV。这栯定能够提供比较高的噪声抑制能力,但同时也带来了一个问题:当ȝ电压在?00mV中间时接收器输出状态不定。由于UART以一个前?0"触发一ơ接收动作,所以接收器的不定态可能会使UART错误地接收一些数据,Dpȝ误动作。当ȝI闲、开路或短\旉有可能出CU电压差低于200mV的情况,必须采取一定措施避免接收器处于不定态。传l的做法是给ȝ加偏|,当ȝI闲或开路时Q利用偏|电dȝ偏置在一个确定的状态(差分电压?00mVQ。但q种Ҏ仍然不能解决ȝ短\时的问题Qؓ此,有些器g刉商接攉限移?200mV/-50mVQy妙地解决了这个问题。例如Maxim公司为MAX3080pdRS-485接口Q不但省M外部偏置电阻Q而且解决了ȝ短\情况下的失效保护问题?/FONT>
地线与接?/B>
电子pȝ的接地是一个非常关键而又常常被忽视的问题Q接地处理不当经怼D不能E_工作甚至危及pȝ安全。对于RS-485|络来讲也是一P没有一个合理的接地pȝ可能会ɾpȝ的可靠性大打折扣,其是在工作环境比较恶劣的情况下Q对于接地的要求更ؓ严格。有关RS-485|络的接地问题很有资料提及Q在设计者中也存在着很多误区Q致佉K信可靠性降低、接口损坏率较高。一个典型的错误观点是认ؓRS-485通信链\不需要信号地Q而只是简单地用一对双l线各个接口的"A"?B"端连接v来。这U处理方法在某些情况下也可以工作Q但l系l埋下了隐患Q主要有以下两方面的问题Q?/FONT>
?:地电位差D的共模干扰问?/FONT>
共模q扰问题。的,RS-485接口采用差分方式传输信号Qƈ不需要相对于某个参照Ҏ信Ppȝ只需两U之间的电位差就可以了。但应该注意的是Q收发器只有在共模电压不出一定范_-7V?12VQ的条g下才能正常工作。当共模电压出此范围就会媄响通信的可靠,直至损坏接口。如?所C,当发送器A向接收器B发送数据时Q发送器A的输出共模电压ؓVOSQ由于两个系l具有各自独立的接地pȝQ存在着地电位差VGPD。那么,接收器输入端的共模电压就会达到VCM=VOS+VGPD。RS-485标准规定VOS?VQ但VGPD可能会有很大q度Q十几伏甚至数十伏)Qƈ可能伴有强干CP致接收器共模输入VCM出正常范围Qƈ在信L上生干扰电,d影响正常通信Q重则损坏接口?/P>
늣辐射QEMIQ问题。驱动器输出信号中的共模部分需要一个返回通\Q如果没有一个低ȝq回通道Q信号地Q,׃以辐的形式q回源端Q整个ȝ׃像一个巨大的天线向外辐射늣波?/P>
因此Q尽是差分传输Q对于RS-485|络来讲Q一条低ȝ信号地还是必不可的。如?a所C,一条低ȝ信号地将两个接口的工作地q接hQ共模q扰电压VGPD被短路。这条信号地可以是额外的一对线Q非屏蔽双绞U)、或者是屏蔽双绞U的屏蔽层。值得注意的是Q这U做法仅寚wd共模q扰有效Q由于干扰源内阻大,短接后不会Ş成很大的接地环\甉|Q对于通信不会有很大媄响。当共模q扰源内阻较低时Q会在接地线上Ş成较大的环\甉|Q媄响正帔R信。笔者认为,可以采取以下三种措施Q?/FONT>
?:地线与接地方?/FONT>
1、若q扰源内M是非常小Q可以考虑在接地线上加限流电阻限制q扰甉|。接地电ȝ增加可能会共模电压升高Q但只要控制在适当的范围内׃会媄响正帔R信Q图4bQ;
2、采用Q地技术,隔断接地环\。当共模q扰内阻很小时上q方法已不能奏效Q此时可以考虑引入干扰的节点Q例如处于恶劣的工作环境的现ZA表)置hQ也是pȝ的电路地与机x大地隔离Q,q样隔断了接地环\Q不会Ş成很大的环\甉|Q图4cQ;
3、采用隔L口。有些情况下Q出于安全或其他斚w的考虑Q电路地必须与机x大地相连Q不能悬,q时可以采用隔离接口来隔断接地回路,但是仍然应该有一条地U将隔离侧的公共端与其它接口的工作地相连Q图4dQ?/P>
瞬态保?/B>
前面提到的接地措施只对低频率的共模干扰有保护作用Q对于频率很高的瞬态干扰就无能为力了。因为引U电感的作用Q对于高频瞬态干扰来Ԍ接地U实际等同于开路。这L瞬态干扰可能会有成百上千伏的电压,但持l时间很短。在切换大功率感性负载(甉|、变压器、电器{)、闪늭q程中都会生幅度很高的瞬态干扎ͼ如果不加以适当防护׃损坏接口。对于这U瞬态干扰可以采用隔L旁\的方法加以防护?/FONT>
?a所CZؓ隔离保护Ҏ。这U方案实际上瞬态高压{Ud隔离接口中的电隔d上,׃隔离层的高绝~电阻,不会产生损害性的涌甉|QvC护接口的作用。通常采用高频变压器、光耦等元g实现接口的电气隔,已有器g厂商所有这些元仉成在一片IC中,使用h非常便,如Maxim公司的MAX1480/MAX1490Q隔ȝ压可以到2500V。这U方案的优点是可以承受高电压、持l时间较长的瞬态干扎ͼ实现h也比较容易,~点是成本较高?/FONT>
?b所CZؓ旁\保护Ҏ。这U方案利用瞬态抑制元Ӟ如TVS、MOV、气体放늮{)危x的瞬态能量旁路到大地Q优Ҏ成本较低Q缺Ҏ保护能力有限Q只能保护一定能量以内的瞬态干扎ͼ持箋旉不能很长Q而且需要有一条良好的q接大地的通道Q实现v来比较困难?/FONT>
实际应用中可以将二者结合v来灵z运用(?cQ。隔L口对大幅度瞬态干扰进行隔,而旁路元件保护隔L口不被过高的瞬态电压击Iѝ?/FONT>
?Q瞬态保护方?/FONT>
l论
RS-485标准定义了一个极为坚固和可靠的通信链\Q具有高噪声抑制、宽共模范围、长传输距离、冲H保护等Ҏ,但一个真正可靠的RS-485|络q有赖于合理的应用。合理的|络布局、信号通道的连l性、周全的保护措施{,在设计之初就应该有一个M规划?/FONT>
问:如何显C的“setup 安?..”中的“setup”去掉,除了用自定义字串来修改这个地方以外,如何把这个setup搞成其他的?比如“安装程序现在将...?/P>
{:DirText "安装E序安?$(^NameDA) 在下列文件夹。要安装C同文件夹Q单?[览(B)] q择其他的文件夹?$_CLICK"
问:如何定义Ƣ迎面的标题字体大?/P>
{:使用以下脚本
E序代码
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ChageFONT
!insertmacro MUI_PAGE_WELCOME
Function ChageFONT
GetDlgItem $0 $MUI_HWND 1201
createFont $1 "Tahoma" "11" "700"
SendMessage $0 ${WM_SETFONT} $1 0
问:d版本?/P>
引用内容
VIProductVersion "1.2.3.4"
VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductName" "Test Application"
VIAddVersionKey /LANG=${LANG_ENGLISH} "Comments" "A test comment"
VIAddVersionKey /LANG=${LANG_ENGLISH} "CompanyName" "Fake company"
VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalTrademarks" "Test Application is a trademark of Fake company"
VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" "?Fake company"
VIAddVersionKey /LANG=${LANG_ENGLISH} "FileDescription" "Test Application"
VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "1.2.3"
在脚本中加入上面的代码,则ؓ NSIS 生成?exe d版本信息。问题就是,能否让属性中语言昄为“中文(中国Q”?
{:中文 ID ?2052??${LANG_ENGLISH} 改ؓ 2052?/P>
问:?2052 之后实变成“中文(中国Q”了。但其他内容仍旧是ؕ码,不知有什么办法可以解军_Q?/P>
{:版本信息讄语句Q放?!insertmacro MUI_LANGUAGE 的后面,NSIS 要注重次序的。如果用古典界面,攑֜ LoadLanguageFile "${NSISDIR}\Contrib\Language files\SimpChinese.nlf" 的后面?/P>
问:如何止昄 banner ?/P>
{:囄的效果是因ؓ安装E序初始化的时候,也就?.onInit 函数里需要用到某个文件的时候安装程序需要搜索整个数据区块来把它解压出来Q当安装E序比较大的时候搜索比较费Ӟq个时候才昄解压癑ֈ比。一般都是用 ReserveFile 来避开q种搜烦。比?Function .onInit 里有Q?/P>
E序代码
InitPluginsDir
File "/oname=$PLUGINSDIR\io.ini" ".\io.ini"
或者其他类似的话,安装E序需要搜索ƈ解压q个文g。一般在脚本头部加:
E序代码
ReserveFile ".\io.ini"
q样 io.ini ׃存在数据区块的尾部,安装E序初始化的时候就不用搜烦整个数据区块了,相当于加快了安装E序的启动速度?/P>
问:Ҏ以上Ҏ使用了,实不会再出现初始化的对话框了,但是在自定义?InstallOptions |C前Q程序还是会停顿一D|_请问q是ZQ如何避免?
{:某些控g比较消耗时间的Q比如显C?ICON、位?{,如果 InstallOptions 里含有这些控件可能会停顿。如?InstallOptions 是第一个页面的话还要把 InstallOptions.dll 加入?ReserveFile 参数里。再或者就是进?InstallOptions 的时候含有比较复杂的指oQ比如@环等。一般在加入 ReserveFile ${NSISDIR}\Plugins\InstallOptions.dll 既可避免?/P>
问:如何q行一个安装文?.inf
{:ExecWait "RunDll32 advpack.dll,LaunchINFSection skins.inf,DefaultInstall"
问:兌文g图标后,图标没变化?/P>
{:h图标用, System::Call shell32.dll::SHChangeNotify(l, l, i, i) v (0x08000000, 0, 0, 0)
问:我用NSIS做好了一个安装程序,因ؓ数据较多Q一共有400多MQ用的LZMA压羃方式Q做好后的安装程序约200MQ但是我发现在运行这个安装程序时会在pȝTEMP目录产生一个同安装后的全部内容同样大的临时文gQ一边运行一边加大,最后到400多MMQ,如果我做的程序小倒没什么,可是q个E序?00多MQ除了要写入安装的数据外q要同样大小的空间放临时文gQ这样子也实在是太花不来Q我惌问:有什么办法能让其在安装时不用这么多的时空间吗Q安装的脚本是用HM NIS Edit的向导生成的?/P>
{:q是因ؓ NSIS 在用 LZMA 旉用了固实压羃Q何谓固实压~,其实是把所有文件统一h压羃Q所以这样压出来的文件更加的,同时也带来了一个问题,安装解压的时候,在时文件夹中生成一个时文Ӟ随着安装的进E逐渐增大Q到最后,需要时文件会变成跟原安装E序一样大Q也是_需要原安装E序 2 倍的I间才可以安装这个程序,所以对于安装大量文件时Q这是不适合的?BR> NSIS 2.07 版本之前 LZMA 法是固实压~的Q没有非固实的选项Q如果需要这样做Q只有下载非固实压羃的编译器Q但?2.07 后的 NSIS ?LZMA 压羃已经改ؓ默认非固实压~了Q所以这个问题同时也不再存在。如果在制作量文g的安装时Q仍然想取用固实压羃可以加入 /SOLID 参数?BR> 像这P SetCompressor /SOLID lzma
问:能不能在 Section 区段中实现读取INI文g状态来安装。若选中单选框1则安?中定义的文g。若不选中则不安装。若选中单选框2则安?定义的文件。若不选则不安装?/P>
{:使用以下代码
E序代码
!include LogicLib.nsh
Section -post
SetOutPath $INSTDIR
!insertmacro MUI_INSTALLOPTIONS_READ $INI_VALUE "info.ini" "Field 2" "State"
${If} $INI_VALUE = 1
File /a ".\file\fileA.exe"
File /a ".\file\fileB.exe"
${EndIf}
!insertmacro MUI_INSTALLOPTIONS_READ $INI_VALUE "info.ini" "Field 3" "State"
${If} $INI_VALUE = 1
File /a ".\file\fileA.exe"
${EndIf}
SectionEnd
或者用以下代?/P>
E序代码
!include LogicLib.nsh
Section -post
SetOutPath $INSTDIR
!insertmacro MUI_INSTALLOPTIONS_READ $INI_VALUE "info.ini" "Field 2" "State"
${If} $INI_VALUE = 1
;选中时执行的代码
File /a ".\file\fileA.exe"
File /a ".\file\fileB.exe"
${Else}
;不选中时执行的代码
File /a ".\file\fileA.exe"
${EndIf}
SectionEnd
问:?NSIS 中如何设|工作目录,例如一些文件的快捷方式Q还有安装完一个Y件后q行一个程序,而这个程序需要检当前工作目录下的某个文Ӟq时候设|工作目录尤为重要,否则E序不能正常q行?/P>
{:NSIS 中设定工作目录?SetOutPathQ例如在q行E序的代?ExecWait "$INSTDIR\test2.exe" 前放?SetOutPath $INSTDIRQ那?$INSTDIR 会成ؓ当前的工作目录,建立快捷方式也会把工作目录设?$INSTDIR。卸载之前运行某E序只需要把q行指o攑ֈ Function un.onInit 里就?/P>
问:记得以前看到有帖子介l过可在NSIS中调?inf文g安装附加驱动E序Q具体实C码如下Ş式:
引用内容
ExecWait "RunDll32 advpack.dll,LaunchINFSection drivers.inf,DefaultInstall"
偶在打包一东东时使用了这一ҎQ但遇到的问题时Q如果在卸蝲区段里设|能自动卸蝲安装q的驱动E序呢?
{:能否卸蝲需要看 INF 文g里面是否有卸载的区段Q例如?NSIS 卸蝲 Windows Messenger 可以q样Q?/P>
E序代码
ExecWait "RunDll32 advpack.dll,LaunchINFSection $windir\INF\msmsgs.inf,BLC.Remove"
关于 BLC.Remove 的来源,可以打开 msmsgs.inf 文g后,能找到名UCؓ BLC.Remove 的区D,该区D는于卸载。区D늚名称是编写者自己定制的。不同的inf文gQ区D名也可能不同。其他的 *.inf 文g也可以按照此cd法?/P>
问:Q问题如下)
1、我做了一个可同时在简J英下执行的安装E序。但有个很大的困惑。刚开始时做的是简体中文版Q在中下当然没问题,但在?J下Q创建的中文E序l名和写注册表时昄的是q。于是想到写一个三者皆适合的安装程序?BR> 我的做法是这LQ在涉及到创Z文程序组和写注册表时Q加入一个判断,如果英文或繁体,则分别创文文件名和big5内码文g名。但在繁体winxp和英文win2k下测试后Q发现根本无法正常创建程序组Q也无法正常生成uninstall.exe文g。而写入注册表的中文字W,也不能在J体pȝ的注册表中正常显C,而是q?BR> h高手Q这U多语言环境下该怎么处理Q才能正常显C呢Q?M能全部都l创建成英文的吧Q?BR> 2、另外有个小问题Q如何让nsis做的安装E序不显C具体的安装文g名,而只昄“正在复制文件……”? 象foobar那样Q可惜foobar也有个显Cl情늚按钮Q我惛_复制文gq程中完全不昄和提C复制的文件情c?/P>
{:Q解{如下)
1、最单的处理办法是l需要处理的资源q行一个定义,然后使用 LangString 定义不同的资源。给个示例:
E序代码
Caption "$(CAPTION)"
LangString CAPTION ${1033} "DreamMail Installation"
LangString CAPTION ${2052} "DreamMail 安装向导"
LangString CAPTION ${1028} "DreamMail 杆旧"
2、可以?DetailPrint Q示例,
E序代码
DetailPrint "正在复制文g..."
问:NSIS对于安装卸蝲的ICO图标大小有什么要?~译的时候出C下错误提C:
引用内容
Error finding icon resources: installer, uninstaller icon size mismatch - see the Icon instructions documentation for more information -- failing!
{:只要保证安装图标与卸载图标大相同即可?/P>
问:如何屏蔽如下图中的安装程序校验?/P>
{:CRCCheck on|off|force 指定安装前安装程序是否对自n执行一?CRC。注意,如果用户使用?/NCRC 命o行参敎ͼ且你没有指定 force 参数Ӟ不会执行 CRCQ这h可能D用户安装一个损坏的安装E序?BR> 安装E序 CRC 校验是默认打开的。可以在脚本中用 CRCCheck off 来默认禁止安装程序的 CRC 校验。不q这样做正如解释上说的可能安装会出现问题。作汉化的最好加上校验,免得安装E序的问题变成你汉化质量的问题?/P>
问:在安装的时候不是可以选择多种语言么?但是我怎样实现当选择英文时就装英文版Q选择中文时就装中文版Q?/P>
{:使用以下脚本Q?/P>
E序代码
StrCmp $LANGUAGE ${LANG_SIMPCHINESE} 0 +3
File "你需要安装的中文文g"
Goto lbl_finish
File "你需要安装的英文文g"
lbl_finish:
问:lgA lgB lgC 均ؓ可选,A可单独安装,B或者C被选择的时候A必须被选择?/P>
{:以下代码Q?/P>
E序代码
Section "lg A" aaa
detailprint "A"
SectionEnd
Section "lg B" bbb
detailprint "B"
SectionEnd
Section "lg C" ccc
detailprint "C"
SectionEnd
Function .onSelChange
SectionGetFlags ${bbb} $0
SectionGetFlags ${ccc} $1
IntOp $0 $0 & 1
IntOp $1 $1 & 1
IntCmp $0 1 0 +2
SectionSetFlags ${aaa} 1
IntCmp $1 1 0 +2
SectionSetFlags ${aaa} 1
FunctionEnd
解释QSectionGetFlags 表示获取某区D늚flags状态(是是否被勾选,选中q回gؓ1Q反之ؓ0Q。SectionGetFlags ${bbb} $0 表示获取序号?{bbb}的区D늚Flags状态ƈ把返回D出到变量 $0QC 区段相同。接着是 StrCmp Q解释同上楼。SectionSetFlags ${aaa} 1 表示讄序号?${aaa} 区段?Flags 状态ؓ 1Q即N?/P>
问:怎么让“许可协议”页面的标题栏,如程序中的“MutliPages 演示”修改ؓ“MutliPages 演示Q许可协议”?/P>
{:首先创徏一个函敎ͼ如下?/P>
E序代码
Function LicensePagePre
SendMessage $HWNDPARENT ${WM_SETTEXT} 0 "STR:我爱?
FunctionEnd
然后在协议页面句?
E序代码
!insertmacro MUI_PAGE_LICENSE "c:\path\to\licence\YourSoftwareLicence.txt"
之前加入如下语句
E序代码
!define MUI_PAGE_CUSTOMFUNCTION_PRE LicensePagePre
问:比如Q我?a.exe 用nsis包装好,安装?c:\helloLib\a.exeQ完成后Q想把c:\helloLib\d到系l环境变量的path里头Q这P在Q何地方输入a.exe可执行。如何将路径d到系l环境变量中Q?/P>
{:以下代码实现Q?/P>
E序代码
ReadRegStr $0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path"
WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" "$0;C:\hellolib"
另类Ҏ一Q写注册表,?/P>
E序代码
[HKEY_CLASSES_ROOT\Applications\a.exe\shell\open\command]
@="yourpath\a.exe"
另类Ҏ二:
E序代码
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\a.exe]
@="c:\helloLib\a.exe"
问:在NSIS中如何才能做到根据对于注册表键值的判断军_是否写入字串Q如果判断出某个key存在Q则写入相应的字Ԍ如果不存在,则不写入字串。例如:我先要判断“HKLM SOFTWARE\nsis”这个key存不存在。如果存在则写入字串“DispName:nsis”,应该是用“WriteRegStr HKLM "SOFTWARE\nsis" "DispName" "nsis"”。如果不存在q个keyQ则不写入注册表Ql下面的安装?/P>
{:以下代码实现Q?/P>
E序代码
ReadRegStr $0 HKLM SOFTWARE\nsis ""
IfErrors 0 +2
Goto +2
WriteRegStr HKLM "SOFTWARE\nsis" "DispName" "nsis"
问:如何制作安装包的时候需要调用系l函数来当前安装包q行的操作系l的内码c?/P>
{:以下代码昄pȝ语言Q?/P>
E序代码
System::Call "Kernel32::GetSystemDefaultLangID(v ..) i .s"
Pop $0
IntOp $0 $0 & 0xFFFF
MessageBox MB_OK $0
问:如何用NSIS注册字体Q?/P>
{:以下代码Q?/P>
E序代码
!include WinMessages.nsh
Section "MainSection" SEC01
File /oname=$FONTS\tahoma.ttf tahoma.ttf
Push "$FONTS\tahoma.ttf"
System::Call "Gdi32::AddFontResource(t s) i .s"
Pop $0
IntCmp $0 0 0 +2 +2
MessageBox MB_OK "注册字体p|"
SendMessage ${HWND_BROADcast} ${WM_FONTCHANGE} 0 0
SectionEnd
问:如何?NSIS 安装输入法?/P>
{:以下代码Q?/P>
E序代码
SetOutPath $SYSDIR
File WBIME.ime
Push "五笔输入?
Push "$SYSDIR\WBIME.ime"
System::Call "Imm32::ImmInstallIME(t s, t s) i .s"
System::Call "Imm32::ImmIsIME(i s) i .s"
Pop $0
IntCmp $0 1 0 +3 +3
MessageBox MB_OK "输入法安装成?
Goto +2
MessageBox MB_OK "输入法安装失?