4动手动脑,总结及凯撒加密

一、StringEquals.java

1.源代码

public class StringEquals {

/**  * @param args the command line arguments*/

public static void main(String[] args) {

String s1=new String("Hello");

String s2=new String("Hello");

System.out.println(s1==s2);

System.out.println(s1.equals(s2)); 

String s3="Hello";

String s4="Hello";

System.out.println(s3==s4);

System.out.println(s3.equals(s4));

}

}

2.运行结果截图

3.分析Java中的equals和==

n==m结果为true,变量n和m存储的值都为3,所以是相等的。但str1和str2两次比较的结果不同,这是因为基本数据类型变量和非基本数据类型变量存在区别。Java里的8种基本数据类型:整型(byte,short,int,long)、浮点型(float,double)、字符型(char)、布尔型(boolean),对于这8种基本数据类型的变量,变量直接存储的是值,因此在用关系操作符==来进行比较时,比较的就是值本身。要注意浮点型和整型都是有符号类型的,而char是无符号类型的(char类型取值范围为0~2^16-1)。

例:

Int n=3;

Int m=3;

变量n和m都是直接存储的“3”数值,所以用==比较的时候输出结果为true.

而对于非基本数据类型的变量,比如源代码里的str1就是引用类型的变量,引用类型的变量存储的并不是 “值”本身,而是于其关联的对象在内存中的地址。

例:

String str1;

这句话声明了一个引用类型的变量,此时它并没有和任何对象关联。而 通过new String("hello")来产生一个对象(也称作为类String的一个实例),并将这个对象和str1进行绑定:str1= new String("hello");那么str1指向了一个对象(很多地方也把str1称作为对象的引用),此时变量str1中存储的是它指向的对象在内存中的存储地址,并不是“值”本身,也就是说并不是直接存储的字符串"hello"。因此在用==对str1和str2进行第一次比较时,得到的结果是false。因此它们分别指向的是不同的对象,也就是说它们实际存储的内存地址不同。而在第二次比较时,都让str1和str2指向了str指向的对象,那么得到的结果毫无疑问是true。

而第三个输出结果为true,是因为String类对equals方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等。

4.总结

1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;如果作用于引用类型的变量,则比较的是所指向的对象的地址

2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

二、String类的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()、toCharArray()使用说明

1.Length()

计算字符串长度。

2.charAt()

获取指定位置的字符

3.getChars()

获取从指定位置起的子串复制到字符数组中,比如 s1.getChars( 0, 5, charArray, 0 );四个参数的含义:

1)被拷贝字符在字串中的起始位置。

2)被拷贝的最后一个字符在字串中的下标再加1。

3)目标字符数组。

4)拷贝的字符放在字符数组中的起始下标。

4.replace()

子串替换,replace(oldstring,newstring);用新字符串代替旧字符串。

5.toUpperCase()、toLowerCase()

大小写转换,比如str.toUpperCase();将str中所有小写转换成大写。

6.trim()

去除头尾空格,比如str=” abc ”,str.trim();将abc头尾的空格去掉。

7.toCharArray()将字符串对象转换为字符数组,str.toCharArray();将str转换成char数组。

三、程序题(课后作业之字串加密)

1、实验题目

使用上述算法加密或解密用户输入的英文字串

2、需求分析

加密的基本思路是:通过把字母移动3位数来实现加密解密。例如原码字母A变成密码的D,依次类推,原码B变成密码E。如果有一个原码字符串为“Hello”,其密码为“Khoor”,那么要加密的话,就将字母向相反方向移动同样位数即可。即密码“Khoor”的每个字母向左移动三位变成“Hello”,由此看来位数3为加密解密的密钥。

3、思路

程序中包含两个类,程序起始类Caesar和类JiaJie。类JiaJie中包含两个方法,public void jia()用于对字符串进行加密,从控制台获得待加密的字符串,定义key=3,利用for循环,将字符串的每一个元素都存入数组中,然后对数组的每一个元素进行加密,再使用两个if...else语句判断是大写还是小写字母,接着判断如果该元素是X(x)、Y(y)、Z(z)则分别替换为A(a)、B(b)、C(c),否则字母向后移动3位,最后输出结果。public void jie()用于对字符串进行解密,方法与加密类似。程序起始类Caesar主要用于调用方法,

4、程序流程图

5、源代码

import java.util.*;

public class Caesar {  

void mj(){

Scanner in = new Scanner(System.in); 

        System.out.print("1.加密;2.解密。请选择:");          

        int n=in.nextInt(); //键盘输入操作序号    

        //加密

        if(n == 1){ 

            System.out.print("输入待加密的字符串:");              

            String str = in.next();//键盘输入字符串         

            String jm="";              

            int key = 3; //密钥

            for(int i = 0;i < str.length();i++)

            {                  

             char c = str.charAt(i);                  

             if(c >= ‘a‘&&c <= ‘z‘)

             {                   

             if(c>=‘x‘&&c<=‘z‘)

             {                    

             c-=26;                    

             c+=key; 

                 }                  

             else{                    

             c+=key;                   

             } 

                } 

                else if(c >= ‘A‘&&c <= ‘Z‘)

                {                   

                 if(c>=‘X‘&&c<=‘Z‘)

                 {                    

                 c-=26;                    

                 c+=key; 

                 }                   

                 else{                    

                 c+=key;                   

                 } 

                }                                   

             jm += c;              

             } 

            System.out.print("加密后的字符串是:"+jm); 

            System.out.print("\n继续,输入1;结束,输入0。请选择:");              

            n=in.nextInt();             

            if(n==1){ 

             this.mj();              

             }  

            if(n==0){ 

                System.out.print("程序结束!");              

                }    

            } 

        //解密

        else if(n == 2){ 

            System.out.print("请输入待解密的字符串:");             

            String str = in.next();              

            String jm="";              

            int key = -3; 

            for(int i = 0;i < str.length();i++){                  

             char c = str.charAt(i);                  

             if(c >= ‘a‘&&c <= ‘z‘){                   

             if(c>=‘a‘&&c<=‘c‘){                    

             c+=26;                    

             c+=key; 

                 }                   

             else{                    

             c+=key;                   

             } 

                } 

                else if(c >= ‘A‘&&c <= ‘Z‘){                   

                 if(c>=‘A‘&&c<=‘C‘){                    

                 c+=26;                    

                 c+=key; 

                 }                   

                 else{                    

                 c+=key;                   

                 } 

                }                                   

             jm += c;              } 

          System.out.println("解密后的字符串:"+jm); 

          System.out.print("\n继续,输入1;结束,输入0。请选择:");            

          n=in.nextInt(); 

          if(n==0)

          {          

           System.out.print("结束程序!"); 

          }            

          else

          {          

           this.mj(); 

          }        

          } 

        } 

    public static void main(String[] args) {     

     Caesar mj=new Caesar();   

        mj.mj();          

        }  

} 

6、运行结果截图

时间: 2024-08-03 13:44:17

4动手动脑,总结及凯撒加密的相关文章

凯撒加密

一.古罗马皇帝凯撒在打仗时曾经使用过以下方法加密军事情报: 请编写一个程序,使用上述算法加密或解密用户输入的英文字串 程序: package demo; /* * 凯撒加密 * 杜泽坤 */ import java.util.*; public class Addmi { public static void main(String[]args){ System.out.println("请输入要加密的字符"); Scanner m=new Scanner(System.in); St

凯撒加密解密(java字母移位)

1.设计思想:加密就是将字符数据转化为ASC码表中的数字,a—w之间通过加3之后再转化为字符型输出,x—z之间通过转化为ASC码表中的数字后减去23再转化为字符型输出.解密就是将字符数据转化为ASC码表中的数字,d—z之间通过减去3之后再转化为字符型输出,a—c之间通过转化为ASC码表中的数字后加23再转化为字符型输出. 2.程序流程图 3.程序源码 import java.util.Scanner;public class Code {//严羽卿 凯撒加密与解密  2015 10 23 pub

凯撒加密与解密实现

1.背景与原理 引自维基百科 在密码学中,凯撒密码(英语:Caesar cipher),或称凯撒加密.凯撒变换.变换加密,是一种最简单且最广为人知的加密技术.它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文.例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推.这个加密方法是以罗马共和时期凯撒的名字命名的,据称当年凯撒曾用此方法与其将军们进行联系. 简单来说就是当秘钥为n,其中一个待加密字符ch,加密之后的字符为ch+n,

凯撒加密问题程序

设计思想:加密的过程是将字母在字母表中的位置向后移两位,即A编程D,字符串+3,解密时字符串-3: 程序流程图: 源代码: //王冶雯   凯撒问题加密和解密     关键点:加密是字符串+3,解密时-3 package string11; import java.util.Scanner; public class jiami { public static void main(String[] args)throws Exception { // TODO Auto-generated me

java程序——凯撒加密

古罗马皇帝凯撒在打仗时曾经使用过以下方法加密军事情报: 请编写一个程序,使用上述算法加密或解密用户输入的英文字串要求设计思想.程序流程图.源代码.结果截图. 设计思想:输入一个字符串,然后将其中每个字符单独取出,并且用字符的算法进行加3,强制转化为后面3位的字符,最后输出. 程序流程图: 源代码: package test; import java.util.*; //引用util包 public class Caesar { public static void main(String[] a

【Java】凯撒加密及课后动手动脑

1.代码及运行结果 在Java中,内容相同的字串常量("Hello")只保存一份以节约内存,所以s0,s1,s2实际上引用的是同一个对象. 编译器在编译s2一句时,会去掉"+"号,直接把两个字串连接起来得一个字串("Hello").这种优化工作由Java编译器自动完成. 当直接使用new关键字创建字符串对象时,虽然值一致(都是"Hello"),但仍然是两个独立的对象. 2.代码及运行结果 给字串变量赋值意味着:两个变量(s1,

凯撒密码加密C语言简单实现

凯撒加密(Julius Caesar)该方法把一条消息中的每个字母用字母表中固定距离之后的那个字母代替.(如果超越了字母Z,会绕道字母表的起始位置.例如,如果每个字母都用字母表中两个位置之后的字母代替,那么Y就会被替换为A,Z就会被替换为B.) 然后编写程序………… 用户输入待加密的消息和移位数: 不是字母的不要改动………… #include <stdio.h> #include <string.h> int main() { char passwd[100],encrypted[

西普学院Crypto之凯撒是罗马共和国杰出的军事统帅

看题目大概可以知道是凯撒加密 密文:MGAKUZKRWZWGAWCP 我写了个程序遍历所有 有可能是答案的结果,代码如下: def echo(n): st="" b=True for i in s: if ord(i)+n in range(256): st+=chr(ord(i)+n) b=True else: b=False if b: print st s = raw_input() for i in range(-500,500): echo(i) 代码写得非常粗糙,没做处理什

PHP脚本实现凯撒加(解)密

原文:PHP脚本实现凯撒加(解)密 今天在看某ctf时候遇到一题凯撒加密的题,然后看到write up里有这样一句 顿时感觉这题目有点坑啊,这要不写个脚本来跑要推到啥时候啊,于是又了本文: 1 <?php 2 $text=" the text "; //需要解密的文本 3 echo $text."<hr>"; 4 for($j=0;$j<25;$j++) 5 { 6 for ($i=0;$i<strlen($text);$i++) 7