??xml version="1.0" encoding="utf-8" standalone="yes"?>
因ؓ计算机是一U电子设备,由复杂的电子元器件组合而成Q一个电子元器g有带电和不带电两U状态,通常我们带늊态表CZؓ数?Q不带电状态表CZؓ数?Q多个这L元器件的l合可以表示更多状态,也就是可以表C更多的数据Q如000表示0Q?01表示1Q?10表示2Q?11表示3Q依此类推,111表示 7Q一个元器g可表CZ位(bitQ数据,q种表示数据的方式就叫二q制?br>在实际的电子讑֤中,我们?个这L元器件Ş成一个单元,q样的单元叫一个字节(byteQ,一个字节能表示多少个数呢?表示数值的范围?-255?br>一个字节由8个二q位l成Q其中最双的一位称为“最低有效位”或“最低位”,最左边的一位称为“最高有效位”或“最高位”。每一个二q位的值是0??
二进制计数的~点:书写太长Q容易出错,一般计机的数据位数都?的整数倍,所以,在计机里通常采用16q制计数法。用数字可以表示各种信息Q计机里只有数|当你在内存中看到一个数值时Q这个数值可能代表各U意义,生活中的数g可以代表其他意义Q如1234可以代表密码Q存NQ电报信息,Ҏ上下U烦Q我们就能够知道q数g表的意义
但是在Java中到底是如何M存数据的呢?下面我就以int数据cdZ说明Java的方式?/p>
大家都知道在Java中规? int = 4 byte, 1 byte = 8 bit。以此推理那?个int在计机中就是以4 * 8 = 32?bit)的方式存储的。而又׃java中的int是属于有W号cd(Java中不存在unsignedcd)Q所?2位的高一位是W号位,由此可以推理出int的储存大区?/p>
Integer.MAX_VALUE = 2147483647(十进? = 1111111 11111111 11111111 11111111(二进?
Integer.MIN_VALUE = -2147483648(十进? = 10000000 00000000 00000000 00000000(二进?
现在我们知道了二q制的概念了Q但是其实二q制我想我们惌的那么单U的表示的,他们是不同的表现方式如:原码Q反码,补码
那么我们q道了1?1的二q制形式分别?000000 00000000 00000000 00000001?1111111 11111111 11111111 11111111QJava中的数据是以补码的Ş式储存的Q了。那么现在我们知道了数据是如何储存的了。那么计机是如何利用这些数据进行计的呢?我们知道在计机的CPU中只有一个加法器Q所有的q算都是需要它q行的。所以在计算机里所有的加减乘除都是转换成加法来q行q算的。那么它们是怎么转换的呢Q下面我们介l一下二q制的运操?/p>
1.数字摘要Q解军_安全的通信环境下,保证信息的唯一的一U方式。通常使用MD5/SHA-1{算法完成摘要。一般比如大家在|上下蝲软g光盘旉会看C个MD5值就是v到这个数字摘要的作用。在|络的环境中发送者把消息和数字摘要一同发送给接收者,接收者用发送者相同的法Ҏ息加密,看是否与发送者发送过来的数字摘要相同Q如果相同就证明消息没有l篡改过。下面是一个最为简单的CZQ?/p>
import java.security.*; public class myDigest { public static void main(String[] args) { myDigest my=new myDigest(); my.testDigest(); } public void testDigest() { try { String myinfo="我的试信息"; //java.security.MessageDigest alg=java.security.MessageDigest.getInstance("MD5"); java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1"); alga.update(myinfo.getBytes()); byte[] digesta=alga.digest(); System.out.println("本信息摘要是:"+byte2hex(digesta)); //通过某中方式传给其他Z的信?myinfo)和摘?digesta) Ҏ可以判断是否更改或传输正? java.security.MessageDigest algb=java.security.MessageDigest.getInstance("SHA-1"); algb.update(myinfo.getBytes()); if (algb.isEqual(digesta,algb.digest())) { System.out.println("信息查正?); } else { System.out.println("摘要不相?); } } catch (java.security.NoSuchAlgorithmException ex) { System.out.println("非法摘要法"); } } public String byte2hex(byte[] b) //二行制{字符? { String hs=""; String stmp=""; for (int n=0;n<b.length;n++) { stmp=(java.lang.Integer.toHexString(b[n] & 0XFF)); if (stmp.length()==1) hs=hs+"0"+stmp; else hs=hs+stmp; if (n<b.length-1) hs=hs+":"; } return hs.toUpperCase(); } }
2.电子{Q对数据信息的发生者n份的认定Q它是一U抽象的概念而不是一U具体技术。实现电子签名的技术手D늛前有多种Q比如基于公钥密码技术的数字{Q或用一个独一无二的以生物特征l计学ؓ基础的识别标识,例如手印、声韛_记或视网膜扫描的识别Q手书签名和囄的电子图象的模式识别Q表明n份的密码代号Q对U算法)Q基于量子力学的计算机等{?/p>
3.数字{Q所谓数字签名就是利用通过某种密码q算生成的一pdW号及代码组成电子密码进?{"Q来代替书写{或印章,对于q种电子式的{在技术上q可q行法验证Q其验证的准度是在物理世界中与手工{和图章的验证是无法相比的。一般实现数字签名的Ҏ是通过生成的密钥对的私钥对用户生成的数字消息进行DSA(Digital Signature Algorithm (DSA)是Schnorr和ElGamal{法的变U,被美国NIST作ؓDSS(DigitalSignature Standard))加密实现的。实C码如下:
*/ import java.security.*; import java.security.spec.*; public class testdsa { public static void main(String[] args) throws java.security.NoSuchAlgorithmException,java.lang.Exception { testdsa my=new testdsa(); my.run(); } public void run() { //数字{生成密钥 //W一步生成密钥对,如果已经生成q?本过E就可以跌,对用h讲myprikey.dat要保存在本地 //而mypubkey.datl发布给其它用户 if ((new java.io.File("myprikey.dat")).exists()==false) { if (generatekey()==false) { System.out.println("生成密钥对|"); return; }; } //W二?此用?//从文件中dU钥,对一个字W串q行{后保存在一个文?myinfo.dat)?//q且再把myinfo.dat发送出?//Z方便数字{也放q了myifno.dat文g?当然也可分别发? try { java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("myprikey.dat")); PrivateKey myprikey=(PrivateKey)in.readObject(); in.close(); // java.security.spec.X509EncodedKeySpec pubX509=new java.security.spec.X509EncodedKeySpec(bX509); //java.security.spec.X509EncodedKeySpec pubkeyEncode=java.security.spec.X509EncodedKeySpec String myinfo="q是我的信息"; //要签名的信息 //用私钥对信息生成数字{ java.security.Signature signet=java.security.Signature.getInstance("DSA"); signet.initSign(myprikey); signet.update(myinfo.getBytes()); byte[] signed=signet.sign(); //对信息的数字{ System.out.println("signed({内容)="+byte2hex(signed)); //把信息和数字{保存在一个文件中 java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("myinfo.dat")); out.writeObject(myinfo); out.writeObject(signed); out.close(); System.out.println("{q生成文件成?); } catch (java.lang.Exception e) { e.printStackTrace(); System.out.println("{q生成文件失?); }; //W三? //其他人通过公共方式得到此户的公钥和文g //其他人用此户的公?Ҏ件进行检?如果成功说明是此用户发布的信? // try { java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("mypubkey.dat")); PublicKey pubkey=(PublicKey)in.readObject(); in.close(); System.out.println(pubkey.getFormat()); in=new java.io.ObjectInputStream(new java.io.FileInputStream("myinfo.dat")); String info=(String)in.readObject(); byte[] signed=(byte[])in.readObject(); in.close(); java.security.Signature signetcheck=java.security.Signature.getInstance("DSA"); signetcheck.initVerify(pubkey); signetcheck.update(info.getBytes()); if (signetcheck.verify(signed)) { System.out.println("info="+info); System.out.println("{正常"); } else System.out.println("非签名正?); } catch (java.lang.Exception e) {e.printStackTrace();}; } //生成一Ҏ件myprikey.dat和mypubkey.dat---U钥和公? //公钥要用户发?文g,|络{方?l其它用?U钥保存在本? public boolean generatekey() { try { java.security.KeyPairGenerator keygen=java.security.KeyPairGenerator.getInstance("DSA"); // SecureRandom secrand=new SecureRandom(); // secrand.setSeed("tttt".getBytes()); //初始化随Z生器 // keygen.initialize(576,secrand); //初始化密钥生成器 keygen.initialize(512); KeyPair keys=keygen.genKeyPair(); // KeyPair keys=keygen.generateKeyPair(); //生成密钥l? PublicKey pubkey=keys.getPublic(); PrivateKey prikey=keys.getPrivate(); java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("myprikey.dat")); out.writeObject(prikey); out.close(); System.out.println("写入对象 prikeys ok"); out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("mypubkey.dat")); out.writeObject(pubkey); out.close(); System.out.println("写入对象 pubkeys ok"); System.out.println("生成密钥Ҏ?); return true; } catch (java.lang.Exception e) { e.printStackTrace(); System.out.println("生成密钥对失?); return false; }; } public String byte2hex(byte[] b) { String hs=""; String stmp=""; for (int n=0;n<b.length;n++) { stmp=(java.lang.Integer.toHexString(b[n] & 0XFF)); if (stmp.length()==1) hs=hs+"0"+stmp; else hs=hs+stmp; if (n<b.length-1) hs=hs+":"; } return hs.toUpperCase(); } } 把他的公钥的信息及签名发l其它用?
4.PKIQ公钥基设施Q:
在空白处右键点击add task repositoryd知识库,如图:
选中JiraQ下一步:
server中填写Jira的地址(http://ycfd.3322.org:88/jira)Qlabel随便填写QUser ID和Password是你在Jira上注册的帐号和密码了Q填写完毕之后点Validate SettingQ验证成功之后点完成卛_?
在添加完repository后,会弹出添加query界面。如图:
选择create query using form后点击nextQ进入query讄界面Q如图:
在project中选中fms后点击finish。这样就完成了各设|?br />
之后打开tasklist视图Qwindow->show view->other->mylyn->task list
点击OKQ后打开task list视图Q如图:
在Task List中你可以看到你的目中的问题和Q务等Q双击Task会显CTask的详l情况:
在Task List中还能新建Taskq提交到JiraQ这里就不多说了Q大家自己尝试一下?/p>
׃mylyn与在我们现在在项目中使用的eclipse开发^Cspringide插g有冲H问题,所以首先大安要把springide插g从eclipse中卸载。步骤如下:
1.在eclipse安装目录下找C个名为links的文件夹Q在q个文g夹中删除Springide.link文g?
2.启动eclipseQ不q与q_不同的是需要在eclipse启动命o中加?clean参数。可以直接加入到eclipse快捷方式的目标项中?
此时eclipse会把springide插g卸蝲Q之后我们就可以安装mylyn插g了。在开始安装mylyn之前Q大安要下载附件中的如下三个文Ӟmylyn-2.1-e3.3.zipQmylyn-2.1-extras.zipQspringide_updatesite_2.0.1_v200708152145.zip
步骤如下Q?
1.讄本地插g归档Q进入help->software updates->find and install菜单后,选择search for new features to install后点击next
q入install界面Q如下图Q?
把下载的三个zip归档加入后,点击finish.
2.在弹出的updatesH口中选中刚才加入的三个归档,q把springide->integrations->spring ide ajdt integrationsL后,如下?
之后q入授权界面Q选择i accept后nextQ如图:
3.在弹出的verificationH口中点击install all开始安装,如图Q?
之后提示是否重启eclipseQ点L?