ข้อมูลที่เข้ารหัสใน 128 คุณสามารถปรับแต่งตารางสัญลักษณ์และใช้สัญลักษณ์ที่คุณชื่นชอบสำหรับการเข้ารหัส
การคัดลอกรหัสมีดังนี้:
แพ็คเกจ com.wmly.enc;
นำเข้า java.util.hashmap;
-
* การเข้ารหัสและถอดรหัส 128 บิตสัญลักษณ์หนึ่งสามารถแสดง 7 บิตได้ 7 บิต
* คุณสามารถปรับแต่งตารางสัญลักษณ์ แต่ไม่สามารถทำซ้ำสัญลักษณ์ได้
-
คลาสสาธารณะ MyBase128 {
ถ่านสุดท้ายคงที่ [] symboltable = char ใหม่ [128];
Public Static Final Hashmap <ตัวละคร, จำนวนเต็ม> indextable = new hashmap <> (128);
คงที่ {
int i = 0;
สำหรับ (int j = 0; j <128; j ++) {
// symboltable [j] = (char) j;
if ('a' <= j && j <= 'z'
|| 'A' <= j && j <= 'z'
|| '0' <= j && j <= '9') {
สัญลักษณ์ [i ++] = (ถ่าน) j;
-
-
สำหรับ (Char C: "สิ่งนี้เขียนโดยคนจีน [Bie Si Yao Aifa] โปรแกรม Codec & มีตารางสัญลักษณ์ที่กำหนดเองที่เป็นเอกลักษณ์ | แต่ผ้าสามารถใช้คำที่ซ้ำกันเหงื่อ (ยังคงเป็น 12 ความรู้*. #) พวกเราที่รัก!
สัญลักษณ์ [i ++] = c;
-
checktable ();
สำหรับ (int j = 0; j <128; j ++) {
indextable.put (สัญลักษณ์ [j], j);
-
-
Void chectable ส่วนตัวคงที่ () ส่งข้อผิดพลาด {
if (symboltable [127] == 0) {
โยนข้อผิดพลาดใหม่ ("ความยาวตารางสัญลักษณ์ไม่ถูกต้อง!");
-
สำหรับ (char a: symboltable) {
จำนวน int = 0;
สำหรับ (char b: symboltable) {
ถ้า (a == b) {
นับ ++;
-
-
ถ้า (นับ> 2) {
โยนข้อผิดพลาดใหม่ ("ตารางสัญลักษณ์มีสัญลักษณ์ซ้ำแล้วซ้ำอีก!");
-
-
-
String Public Excode (byte [] data) {
if (data == null || data.length == 0) {
ส่งคืนสตริงใหม่ ();
-
StringBuilder result = new StringBuilder ();
int tail = 0;
สำหรับ (int i = 0; i <data.length; i ++) {
int mov = (i % 7 + 1);
int curr = 0xff & data [i];
รหัส int = tail + (curr >> mov);
result.append (สัญลักษณ์ [รหัส]);
tail = (0xff & (curr << (8 - mov))) >> 1;
ถ้า (mov == 7) {
result.append (สัญลักษณ์ [หาง]);
หาง = 0;
-
-
result.append (สัญลักษณ์ [หาง]);
Return result.toString ();
-
ไบต์สาธารณะ [] decode (String base128) {
if (base128 == null || base128.length () == 0) {
ส่งคืนไบต์ใหม่ [] {};
-
ความยาว int = (int) math.floor (base128.length () * 0.875);
ไบต์ [] ผลลัพธ์ = ไบต์ใหม่ [ความยาว];
int idx = 0;
int head = indextable.get (base128.charat (0)) << 1;
สำหรับ (int i = 1; i <base128.length ();) {
int mod = i % 8;
int code = indextable.get (base128.charat (i ++));
ผลลัพธ์ [idx ++] = (ไบต์) (0xff & (หัว+(รหัส >> (7 - mod))));
ถ้า (mod == 7) {
head = 0xff & (indextable.get (base128.charat (i ++)) << 1);
} อื่น {
head = 0xff & (รหัส << (mod + 1));
-
-
ผลการกลับมา;
-
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////it /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////it /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////it /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////it /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////it ///// ////////////////////////////////
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {
MyBase128 base128 = ใหม่ myBase128 ();
ทดสอบ (base128);
String txt = "นี่คือการทดสอบการเข้ารหัสและการถอดรหัสของฉัน";
enc = base128.encode (txt.getBytes ());
System.out.println (ENC);
System.out.println ("----------------");
System.out.println (สตริงใหม่ (base128.decode (ENC)));
-
การทดสอบโมฆะแบบคงที่ส่วนตัว (MyBase128 base128) {
สำหรับ (int i = 0; i <10,000; i ++) {
สตริง r = randomData ();
สตริง d = สตริงใหม่ (base128.decode (base128.encode (r.getBytes ())));
ถ้า (! r.equals (d)) {
// d = สตริงใหม่ (base128.decode (base128.encode (r.getBytes ())));
System.out.println ("การเข้ารหัสล้มเหลว !:" + r);
-
-
-
สตริงคงที่ส่วนตัวแบบสุ่ม data () {
String textString = "ฉันเบื่อเครื่องชงกาแฟและสวมวิก/n/r-";
int start = random (0, textString.length () - 3);
int end = random (start + 1, textString.length () - 1);
ส่งคืน textString.substring (เริ่มต้นจบ);
-
สุ่ม int คงแบบส่วนตัว (int i, int j) {
return (int) math.ceil (math.random ()*(ji)+i);
-
-