/** * @author 康雨城 北京大学软件与微电子学院 * @time 2017/11/22 */ import java.util.Scanner; public class Main { //定义输入字的长度,根据题意,长度为8,也就是用8个16进制的数来表示一个字 public static int WORD_STRING_LENGTH=8; //一个字占32bit,用32位二进制数来表示 public static int BIT_LIST_LENGTH=4*WORD_STRING_LENGTH; //定义二进制与十进制对应的数组 public static String[] list={ "0000","0001","0010","0011", "0100","0101","0110","0111", "1000","1001","1010","1011", "1100","1101","1110","1111"}; public static void main(String[] args) { Scanner input =new Scanner(System.in); //String str=input.next();//获取输入的字 String str1="1a2b3c4d"; String result1=getResult(str1); System.out.println("输入 "+str1+" 的线性变换结果为 "+result1); String str2="c1000000"; String result2=getResult(str2); System.out.println("输入 "+str2+" 的线性变换结果为 "+result2); String str3="80000000"; String result3=getResult(str3); System.out.println("输入 "+str3+" 的线性变换结果为 "+result3); } /* 该方法实现线性变换模块。要求:用户输入一个用16进制表示的数字(例如 1a2b3c4d) 程序输出相应的用16进制表示的字 */ private static String getResult(String str){ int[] B=new int[BIT_LIST_LENGTH];//用于存储输入字转为二进制的数 int[] LB=new int[BIT_LIST_LENGTH];//用于存储得到的二进制结果 String LB_16="";//用于存储得到的十六进制结果 //进行一次循环,将输入的十六进制的数转化为二进制的数 for(int i=0;i<WORD_STRING_LENGTH;i++){ int k=Integer.valueOf(str.substring(i,i+1),16); for(int j=0;j<4;j++){ B[4*i+j]=list[k].charAt(j)-48; } } //进行线性变换操作 for(int p=0;p<BIT_LIST_LENGTH;p++){ LB[p]=B[p]^ B[(p+BIT_LIST_LENGTH-2)%BIT_LIST_LENGTH]^ B[(p+BIT_LIST_LENGTH-10)%BIT_LIST_LENGTH]^ B[(p+BIT_LIST_LENGTH-18)%BIT_LIST_LENGTH]^ B[(p+BIT_LIST_LENGTH-24)%BIT_LIST_LENGTH]; } //将二进制的数转换为十六进制的数 for(int x=0;x<WORD_STRING_LENGTH;x++){ String temp=""; for(int y=0;y<4;y++){ temp+=LB[x*4+y]; } LB_16+=Integer.toHexString(Integer.parseInt(temp, 2)); } return LB_16; } }