国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

128進制加密數據示例分享

2019-11-26 15:35:56
字體:
來源:轉載
供稿:網友

128進制加密數據,可以自定符號表,使用自己喜歡的符號做加密

復制代碼 代碼如下:

package com.wmly.enc;

import java.util.HashMap;

/**
 * 128進制加解密, 一個符號可表示7個bit
 * 可以自定義符號表, 符號不能重復
 */
public class MyBASE128 {

 public static final char[] symbolTable = new char[128];
 public static final HashMap<Character, Integer> indexTable = new HashMap<>(128);
 static {
  int i = 0;
  for (int j = 0; j < 128; j++) {
//   symbolTable[j] = (char) j;
   if('A' <= j && j <= 'Z'
    || 'a' <= j && j <= 'z'
    || '0' <= j && j <= '9') {
    symbolTable[i++] = (char) j;
   }
  }
  for (char c : "這是中國人寫地[備思要愛發]編解碼程序&擁有獨特的自定義符號表|不過布能使用重復字,汗啊(還差一十二個知*.#)。為我們加油吧,親!".toCharArray()) {
   symbolTable[i++] = c;
  }

  checkTable();

  for (int j = 0; j < 128; j++) {
   indexTable.put(symbolTable[j], j);
  }
 }

 private static void checkTable() throws Error {
  if(symbolTable[127] == 0) {
   throw new Error("符號表長度不正確!");
  }
  for (char a : symbolTable) {
   int count = 0;
   for (char b : symbolTable) {
    if(a == b) {
     count++;
    }
   }
   if(count > 2) {
    throw new Error("符號表有重復符號!");
   }
  }
 }

 public String encode(byte[] data) {
  if(data == null || data.length == 0) {
   return new String();
  }
  StringBuilder result = new StringBuilder();
  int tail = 0;
  for (int i = 0; i < data.length; i++) {
   int mov = (i % 7 + 1);
   int curr = 0xFF & data[i];
   int code = tail + (curr >> mov);
   result.append(symbolTable[code]);
   tail = (0xFF & (curr << (8 - mov))) >> 1;
   if(mov == 7) {
    result.append(symbolTable[tail]);
    tail = 0;
   }
  }
  result.append(symbolTable[tail]);
  return result.toString();
 }

 public byte[] decode(String base128) {
  if(base128 == null || base128.length() == 0) {
   return new byte[] { };
  }
  int length = (int) Math.floor(base128.length() * 0.875);
  byte[] result = new byte[length];
  int idx = 0;
  int head = indexTable.get(base128.charAt(0)) << 1;
  for (int i = 1; i < base128.length();) {
   int mod = i % 8;
   int code = indexTable.get(base128.charAt(i++));
   result[idx++] = (byte) (0xFF & (head + (code >> (7 - mod))));
   if(mod == 7) {
    head = 0xFF & (indexTable.get(base128.charAt(i++)) << 1);
   } else {
    head = 0xFF & (code << (mod + 1));
   }
  }
  return result;
 }

 ///////////////////////測試方法///////////////////////////////
 public static void main(String[] args) {
  MyBASE128 base128 = new MyBASE128();
  test(base128);

  String txt = "這是我的加解密測試";
  String enc = base128.encode(txt.getBytes());
  System.out.println(enc);
  System.out.println("----------------");
  System.out.println(new String(base128.decode(enc)));
 }

 private static void test(MyBASE128 base128) {
  for (int i = 0; i < 10000; i++) {
   String r = randomData();
   String d = new String(base128.decode(base128.encode(r.getBytes())));
   if(!r.equals(d)) {
//    d = new String(base128.decode(base128.encode(r.getBytes())));
    System.out.println("加解密失敗!: " + r);
   }
  }
 }

 private static String randomData() {
  String textString = "了咖啡機累啊戴假發/n/r哦-";
  int start = random(0, textString.length() - 3);
  int end = random(start + 1, textString.length() - 1);
  return textString.substring(start, end);
 }

 private static int random(int i, int j) {
  return (int) Math.ceil(Math.random()*(j-i)+i);
 }
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临江市| 瑞昌市| 班玛县| 盘锦市| 巢湖市| 呼图壁县| 镇江市| 资源县| 独山县| 梁山县| 屏东市| 四平市| 连江县| 全南县| 漳州市| 广德县| 桃江县| 六安市| 徐水县| 开远市| 连平县| 祁门县| 介休市| 和平县| 屏边| 修水县| 广东省| 大姚县| 西乌| 米林县| 故城县| 洮南市| 密云县| 塔城市| 长治市| 东丽区| 佳木斯市| 八宿县| 柏乡县| 深圳市| 小金县|