import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 把字符串转换成十六进制的Unicode编码后保存,输出的
* 为每个字符的十六进制最后一位为前面一个字符的十六进、
* 制编码的最后一位。
* @author jzj
*/
public class Encrypt {
public static void main(String[] args) {
try {
//生成加密文件
//createEncryptFile();
//读取解密文件
System.out.println(decryptFromFile());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private static StringBuffer decryptFromFile() throws FileNotFoundException, IOException {
String fileName;
StringBuffer fileContentSb;
//--读加密文件
fileName = "e:/tmp/encrypt.txt";
fileContentSb = readFile(fileName);
String fileConString = fileContentSb.toString();
Pattern p = Pattern.compile(".{4}");
Matcher m = p.matcher(fileConString);
String[] encryptArr = new String[fileConString.length() / 4];
int index = 0;
while (m.find()) {
encryptArr[index++] = m.group();
}
//解密
StringBuffer decryptSb = decrypt(encryptArr);
return decryptSb;
}
private static StringBuffer createEncryptFile() throws FileNotFoundException, IOException {
String fileName;
StringBuffer fileContentSb;
//--读源文件
fileName = "e:/tmp/source.txt";
fileContentSb = readFile(fileName);
//加密
String[] hexStrArr = encrypt(fileContentSb);
//--生成加密文件
fileName = "e:/tmp/encrypt.txt";
StringBuffer sb = new StringBuffer();
for (int i = 0; i < hexStrArr.length; i++) {
sb.append(hexStrArr[i]);
}
writeFile(fileName, sb);
return fileContentSb;
}
private static void writeFile(String fileName, StringBuffer sb2) throws FileNotFoundException,
IOException {
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(fileName));
osw.write(sb2.toString());
osw.close();
}
private static StringBuffer decrypt(String[] hexStrArr) {
StringBuffer sb2 = new StringBuffer();
for (int i = 0; i < hexStrArr.length; i++) {
char encryptChar = 0;
String prefixChar;
if (i != 0) {
prefixChar = hexStrArr[i - 1];
} else {
prefixChar = hexStrArr[hexStrArr.length - 1];
}
encryptChar = prefixChar.charAt(prefixChar.length() - 1);
sb2.append((char) (Integer
.parseInt(hexStrArr[i].replaceAll(".$", encryptChar + ""), 16)));
}
return sb2;
}
private static String[] encrypt(StringBuffer sb) {
//存储密文
String[] hexStrArr = new String[sb.length()];
for (int i = 0; i < sb.length(); i++) {
//加密字符
char encryptChar = 0;
//下一个字符
String nextString;
if (i != sb.length() - 1) {
nextString = Integer.toString(sb.charAt(i + 1), 16);
} else {
nextString = Integer.toString(sb.charAt(0), 16);
}
encryptChar = nextString.charAt(nextString.length() - 1);
//原有字符转成十六进制
String tmpstr = Integer.toHexString(((sb.charAt(i)) & 0x0000FFFF) | 0xFFFF0000)
.substring(4);
//把原来字符十六进制最后一位替换成下一个字符的最后一位
hexStrArr[i] = tmpstr.replaceAll(".$", String.valueOf(encryptChar));
}
return hexStrArr;
}
private static StringBuffer readFile(String fileName) throws FileNotFoundException, IOException {
InputStreamReader isr;
isr = new InputStreamReader(new FileInputStream(fileName));
char[] tmpCharArr = new char[1024];
int readCount = isr.read(tmpCharArr);
StringBuffer sb = new StringBuffer();
while (readCount != -1) {
sb.append(tmpCharArr, 0, readCount);
readCount = isr.read(tmpCharArr);
}
isr.close();
return sb;
}
}
分享到:
相关推荐
涵盖了ASCII编码、Base64/32/16编码、shellcode编码、Quoted-printable编码、XXencode编码、UUencode编码、URL编码、Unicode编码、Escape/Unescape编码、HTML实体编码、敲击码、莫尔斯电码等多种编码方式,同时也...
8. Unicode 编码:Unicode 编码是一种用于表示 Unicode 字符的编码方式。 9. Escape/Unescape 编码:Escape/Unescape 编码是一种用于将特殊字符转换为可传输的字符的编码方式。 10. HTML 实体编码:HTML 实体编码...
8. Unicode 编码:Unicode 是一种字符编码标准,使用 16 位二进制数来表示字符。 9. Escape/Unescape 编码:Escape/Unescape 是一种编码方式,使用“\”符号来表示特殊字符。 10. HTML 实体编码:HTML 实体编码是...
Unicode 编码方案是 Java 语言采用的字符编码方案,它是国际标准化组织(ISO)制定的通用字符集,每个 Unicode 码占用 16 个比特位。Unicode 编码方案可以表示世界上所有的语言和符号。 5. 设 a = 8,那么表达式 a ...
Java和Unicode码 本章:小结 参考资源 第二章:程序、数据、变量和计算 数据和变量 变量的命名 变量名和Unicode码 变量和类型 整型数据类型 整型字面值 整型变量的声明 浮点数据类型 浮点字面值 浮点型变量的声明 ...
Java和Unicode码 本章:小结 参考资源 第二章:程序、数据、变量和计算 数据和变量 变量的命名 变量名和Unicode码 变量和类型 整型数据类型 整型字面值 整型变量的声明 浮点数据类型 浮点字面值 浮点型变量的声明 ...
本实例实现时,主要是用Convert 类的ToChar 方法来获取单个字符的Unicode 编码,然后将字母的前13 个和后13 个对调,从而实现加密的功能。下面对Convert类的ToChar 方法进行详细讲解。 ToChar 方法返回指定的Unicode...
个人原创软件,MFC界面,可以任意转换64bit数据到2进制、10进制、16进制,支持取位、移位、大小端转换、加、减、乘、除、取余、与、或、非计算,支持Unicode、ANSI、UTF-8编码相互转换,支持MD5-32/MD5-16、CRC32/...
charCodeAt 方法 返回指定字符的 Unicode 编码。 逗号运算符 (,) 使两个表达式连续执行。 /*..*/ (多行注释语句) 使多行注释部分被 JScript 语法分析器忽略。 注释语句 - 单行(//) 使 JScript 语法分析器忽略...
charCodeAt 方法 返回指定字符的 Unicode 编码。 逗号运算符 (,) 使两个表达式连续执行。 /*..*/ (多行注释语句) 使多行注释部分被 JScript 语法分析器忽略。 注释语句 - 单行(//) 使 JScript 语法分析器忽略...
charCodeAt 方法 返回指定字符的 Unicode 编码。 逗号运算符 (,) 使两个表达式连续执行。 /*..*/ (多行注释语句) 使多行注释部分被 JScript 语法分析器忽略。 注释语句 - 单行(//) 使 JScript 语法分析器忽略...
8. Java语言使用的字符集是Unicode。 9. Java的int型变量占内存的字节是4个字节。 10. 实型常量可以是浮点数或指数形式,如12.4或2e4f。 11. 对象可以有属性和方法,属性可以是简单变量或对象。 12. Boolean类型的...
6. 字符类型与字符编码 3. 简单函数 1. 数学函数 2. 自定义函数 3. 形参和实参 4. 全局变量、局部变量和作用域 4. 分支语句 1. if语句 2. if/else语句 3. 布尔代数 4. switch语句 5. 深入理解函数 1. return语句 2. ...