Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 310|回复: 0

[算法学习]Base64加密算法源码(java版)

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-6 00:03:22 | 显示全部楼层 |阅读模式
    来源:http://blog.csdn.net/zyg158/arcHive/2007/06/26/1667531.aspx
    1. public class Base64 {
    2.     private static final byte[] encodingTable = {
    3.             (byte) "A", (byte) "B", (byte) "C", (byte) "D", (byte) "E",
    4.             (byte) "F", (byte) "G", (byte) "H", (byte) "I", (byte) "J",
    5.             (byte) "K", (byte) "L", (byte) "M", (byte) "N", (byte) "O",
    6.             (byte) "P", (byte) "Q", (byte) "R", (byte) "S", (byte) "T",
    7.             (byte) "U", (byte) "V", (byte) "W", (byte) "X", (byte) "Y",
    8.             (byte) "Z", (byte) "a", (byte) "b", (byte) "c", (byte) "d",
    9.             (byte) "e", (byte) "f", (byte) "g", (byte) "h", (byte) "i",
    10.             (byte) "j", (byte) "k", (byte) "l", (byte) "m", (byte) "n",
    11.             (byte) "o", (byte) "p", (byte) "q", (byte) "r", (byte) "s",
    12.             (byte) "t", (byte) "u", (byte) "v", (byte) "w", (byte) "x",
    13.             (byte) "y", (byte) "z", (byte) "0", (byte) "1", (byte) "2",
    14.             (byte) "3", (byte) "4", (byte) "5", (byte) "6", (byte) "7",
    15.             (byte) "8", (byte) "9", (byte) "+", (byte) "/"
    16.         };
    17.     private static final byte[] decodingTable;
    18.     static {
    19.         decodingTable = new byte[128];
    20.         for (int i = 0; i < 128; i++) {
    21.             decodingTable[i] = (byte) -1;
    22.         }
    23.         for (int i = "A"; i <= "Z"; i++) {
    24.             decodingTable[i] = (byte) (i - "A");
    25.         }
    26.         for (int i = "a"; i <= "z"; i++) {
    27.             decodingTable[i] = (byte) (i - "a" + 26);
    28.         }
    29.         for (int i = "0"; i <= "9"; i++) {
    30.             decodingTable[i] = (byte) (i - "0" + 52);
    31.         }
    32.         decodingTable["+"] = 62;
    33.         decodingTable["/"] = 63;
    34.     }
    35.     public static byte[] encode(byte[] data) {
    36.         byte[] bytes;
    37.         int modulus = data.length % 3;
    38.         if (modulus == 0) {
    39.             bytes = new byte[(4 * data.length) / 3];
    40.         } else {
    41.             bytes = new byte[4 * ((data.length / 3) + 1)];
    42.         }
    43.         int dataLength = (data.length - modulus);
    44.         int a1;
    45.         int a2;
    46.         int a3;
    47.         for (int i = 0, j = 0; i < dataLength; i += 3, j += 4) {
    48.             a1 = data[i] & 0xff;
    49.             a2 = data[i + 1] & 0xff;
    50.             a3 = data[i + 2] & 0xff;
    51.             bytes[j] = encodingTable[(a1 >>> 2) & 0x3f];
    52.             bytes[j + 1] = encodingTable[((a1 << 4) | (a2 >>> 4)) & 0x3f];
    53.             bytes[j + 2] = encodingTable[((a2 << 2) | (a3 >>> 6)) & 0x3f];
    54.             bytes[j + 3] = encodingTable[a3 & 0x3f];
    55.         }
    56.         int b1;
    57.         int b2;
    58.         int b3;
    59.         int d1;
    60.         int d2;
    61.         switch (modulus) {
    62.         case 0: /* nothing left to do */
    63.             break;
    64.         case 1:
    65.             d1 = data[data.length - 1] & 0xff;
    66.             b1 = (d1 >>> 2) & 0x3f;
    67.             b2 = (d1 << 4) & 0x3f;
    68.             bytes[bytes.length - 4] = encodingTable[b1];
    69.             bytes[bytes.length - 3] = encodingTable[b2];
    70.             bytes[bytes.length - 2] = (byte) "=";
    71.             bytes[bytes.length - 1] = (byte) "=";
    72.             break;
    73.         case 2:
    74.             d1 = data[data.length - 2] & 0xff;
    75.             d2 = data[data.length - 1] & 0xff;
    76.             b1 = (d1 >>> 2) & 0x3f;
    77.             b2 = ((d1 << 4) | (d2 >>> 4)) & 0x3f;
    78.             b3 = (d2 << 2) & 0x3f;
    79.             bytes[bytes.length - 4] = encodingTable[b1];
    80.             bytes[bytes.length - 3] = encodingTable[b2];
    81.             bytes[bytes.length - 2] = encodingTable[b3];
    82.             bytes[bytes.length - 1] = (byte) "=";
    83.             break;
    84.         }
    85.         return bytes;
    86.     }
    87.     public static byte[] decode(byte[] data) {
    88.         byte[] bytes;
    89.         byte b1;
    90.         byte b2;
    91.         byte b3;
    92.         byte b4;
    93.         data = discardNonBase64Bytes(data);
    94.         if (data[data.length - 2] == "=") {
    95.             bytes = new byte[(((data.length / 4) - 1) * 3) + 1];
    96.         } else if (data[data.length - 1] == "=") {
    97.             bytes = new byte[(((data.length / 4) - 1) * 3) + 2];
    98.         } else {
    99.             bytes = new byte[((data.length / 4) * 3)];
    100.         }
    101.         for (int i = 0, j = 0; i < (data.length - 4); i += 4, j += 3) {
    102.             b1 = decodingTable[data[i]];
    103.             b2 = decodingTable[data[i + 1]];
    104.             b3 = decodingTable[data[i + 2]];
    105.             b4 = decodingTable[data[i + 3]];
    106.             bytes[j] = (byte) ((b1 << 2) | (b2 >> 4));
    107.             bytes[j + 1] = (byte) ((b2 << 4) | (b3 >> 2));
    108.             bytes[j + 2] = (byte) ((b3 << 6) | b4);
    109.         }
    110.         if (data[data.length - 2] == "=") {
    111.             b1 = decodingTable[data[data.length - 4]];
    112.             b2 = decodingTable[data[data.length - 3]];
    113.             bytes[bytes.length - 1] = (byte) ((b1 << 2) | (b2 >> 4));
    114.         } else if (data[data.length - 1] == "=") {
    115.             b1 = decodingTable[data[data.length - 4]];
    116.             b2 = decodingTable[data[data.length - 3]];
    117.             b3 = decodingTable[data[data.length - 2]];
    118.             bytes[bytes.length - 2] = (byte) ((b1 << 2) | (b2 >> 4));
    119.             bytes[bytes.length - 1] = (byte) ((b2 << 4) | (b3 >> 2));
    120.         } else {
    121.             b1 = decodingTable[data[data.length - 4]];
    122.             b2 = decodingTable[data[data.length - 3]];
    123.             b3 = decodingTable[data[data.length - 2]];
    124.             b4 = decodingTable[data[data.length - 1]];
    125.             bytes[bytes.length - 3] = (byte) ((b1 << 2) | (b2 >> 4));
    126.             bytes[bytes.length - 2] = (byte) ((b2 << 4) | (b3 >> 2));
    127.             bytes[bytes.length - 1] = (byte) ((b3 << 6) | b4);
    128.         }
    129.         return bytes;
    130.     }
    131.     public static byte[] decode(String data) {
    132.         byte[] bytes;
    133.         byte b1;
    134.         byte b2;
    135.         byte b3;
    136.         byte b4;
    137.         data = discardNonBase64Chars(data);
    138.         if (data.charAt(data.length() - 2) == "=") {
    139.             bytes = new byte[(((data.length() / 4) - 1) * 3) + 1];
    140.         } else if (data.charAt(data.length() - 1) == "=") {
    141.             bytes = new byte[(((data.length() / 4) - 1) * 3) + 2];
    142.         } else {
    143.             bytes = new byte[((data.length() / 4) * 3)];
    144.         }
    145.         for (int i = 0, j = 0; i < (data.length() - 4); i += 4, j += 3) {
    146.             b1 = decodingTable[data.charAt(i)];
    147.             b2 = decodingTable[data.charAt(i + 1)];
    148.             b3 = decodingTable[data.charAt(i + 2)];
    149.             b4 = decodingTable[data.charAt(i + 3)];
    150.             bytes[j] = (byte) ((b1 << 2) | (b2 >> 4));
    151.             bytes[j + 1] = (byte) ((b2 << 4) | (b3 >> 2));
    152.             bytes[j + 2] = (byte) ((b3 << 6) | b4);
    153.         }
    154.         if (data.charAt(data.length() - 2) == "=") {
    155.             b1 = decodingTable[data.charAt(data.length() - 4)];
    156.             b2 = decodingTable[data.charAt(data.length() - 3)];
    157.             bytes[bytes.length - 1] = (byte) ((b1 << 2) | (b2 >> 4));
    158.         } else if (data.charAt(data.length() - 1) == "=") {
    159.             b1 = decodingTable[data.charAt(data.length() - 4)];
    160.             b2 = decodingTable[data.charAt(data.length() - 3)];
    161.             b3 = decodingTable[data.charAt(data.length() - 2)];
    162.             bytes[bytes.length - 2] = (byte) ((b1 << 2) | (b2 >> 4));
    163.             bytes[bytes.length - 1] = (byte) ((b2 << 4) | (b3 >> 2));
    164.         } else {
    165.             b1 = decodingTable[data.charAt(data.length() - 4)];
    166.             b2 = decodingTable[data.charAt(data.length() - 3)];
    167.             b3 = decodingTable[data.charAt(data.length() - 2)];
    168.             b4 = decodingTable[data.charAt(data.length() - 1)];
    169.             bytes[bytes.length - 3] = (byte) ((b1 << 2) | (b2 >> 4));
    170.             bytes[bytes.length - 2] = (byte) ((b2 << 4) | (b3 >> 2));
    171.             bytes[bytes.length - 1] = (byte) ((b3 << 6) | b4);
    172.         }
    173.         return bytes;
    174.     }
    175.     private static byte[] discardNonBase64Bytes(byte[] data) {
    176.         byte[] temp = new byte[data.length];
    177.         int bytesCopied = 0;
    178.         for (int i = 0; i < data.length; i++) {
    179.             if (isValidBase64Byte(data[i])) {
    180.                 temp[bytesCopied++] = data[i];
    181.             }
    182.         }
    183.         byte[] newData = new byte[bytesCopied];
    184.         System.arraycopy(temp, 0, newData, 0, bytesCopied);
    185.         return newData;
    186.     }
    187.     private static String discardNonBase64Chars(String data) {
    188.         StringBuffer sb = new StringBuffer();
    189.         int length = data.length();
    190.         for (int i = 0; i < length; i++) {
    191.             if (isValidBase64Byte((byte) (data.charAt(i)))) {
    192.                 sb.append(data.charAt(i));
    193.             }
    194.         }
    195.         return sb.toString();
    196.     }
    197.     private static boolean isValidBase64Byte(byte b) {
    198.         if (b == "=") {
    199.             return true;
    200.         } else if ((b < 0) || (b >= 128)) {
    201.             return false;
    202.         } else if (decodingTable[b] == -1) {
    203.             return false;
    204.         }
    205.         return true;
    206.     }
    207.     public static void main(String[] args) {
    208.         String data = "中华人民共和国";
    209.         byte[] result = Base64.encode(data.getBytes());
    210.         System.out.println(data);
    211.         System.out.println(new String(result));
    212.         System.out.println(new String(Base64.decode(new String(result))));
    213.     }
    214. }
    复制代码
    运行结果: C:        est>java Base64
    中华人民共和国
    1tC7qsjLw/G5srrNufo=
    中华人民共和国  
       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/11/6/000322171.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 11:13 , Processed in 0.307771 second(s), 36 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表