`

字符Unicode编码移位输出

    博客分类:
  • Java
阅读更多
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;
	}
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics