皮皮网

【php棋牌网站源码】【禾匠开源本地化源码】【多个小程序源码合集怎么弄】base64decoder 源码

2024-11-23 08:59:13 来源:趣味生活app源码

1.这个(base64编码)音频数据怎么用?
2.在Java中如何进行BASE64编码和解码
3.java base64decoder
4.Java中用Base64编程的php棋牌网站源码文件批量加密解密工具程序代码
5.如何使用JAVA实现对字符串的DES加密和解密
6.Base64编码解码原理

base64decoder 源码

这个(base64编码)音频数据怎么用?

       import java.io.File;

       import java.io.FileInputStream;

       import java.io.FileOutputStream;

       import java.io.FileWriter;

       import java.io.InputStream;

       import java.io.OutputStream;

       import sun.misc.BASEDecoder;

       import sun.misc.BASEEncoder;

       public class base {

       public static String getWAVString(){

       File fi = new File("click.wav");

       if (!fi.exists())

       return "";

       byte[] data = null;

       try{

       InputStream is = new FileInputStream(fi);

       data = new byte[is.available()];

       is.read(data);

       is.close();

       }catch(Exception ex){

       ex.printStackTrace();

       }

       BASEEncoder encoder = new BASEEncoder();

       return encoder.encode(data);

       }

       public static void getWAV(){

       BASEDecoder decoder = new BASEDecoder();

       try{

       byte[] data = decoder.decodeBuffer(WAVString);

       /*for(int i=0 ;i<data.length;i++){

       if (data[i] < 0) {

       data[i] += ;  

       }  

       }*/

       OutputStream out = new FileOutputStream("click_BASE.wav");

       out.write(data);

       out.flush();

       out.close();

       }catch(Exception ex){

       }

       }

       public static void main(String[] args){

       WAVString = getWAVString();

       try{

       FileWriter out = new FileWriter("Click_BASEString.txt");

       out.write(WAVString);

       out.flush();

       out.close();

       }catch(Exception ex){

       }

       getWAV();

       }

       private static String WAVString;

       }

在Java中如何进行BASE编码和解码

       import sun.misc.BASEEncoder; 

       import sun.misc.BASEDecoder; 

       // å°† s è¿›è¡Œ BASE ç¼–码 

       public static String getBASE(String s) {  

       if (s == null) return null; 

       return (new sun.misc.BASEEncoder()).encode( s.getBytes() ); 

       } 

       // å°† BASE ç¼–码的字符串 s è¿›è¡Œè§£ç  

       public static String getFromBASE(String s) {  

       if (s == null) return null; 

       BASEDecoder decoder = new BASEDecoder(); 

       try {  

       byte[] b = decoder.decodeBuffer(s); 

       return new String(b); 

       } catch (Exception e) {  

       return null; 

       } 

       }

java basedecoder

       java basedecoder是什么,让我们一起了解一下?

        decoder是java base的解码,可以用Java程式语言来实操Base的编码与解码功能,在实际应用上,Base除了能将Binary资料可视化之外,也常用来表示字串加密过后的内容。

        那么在Java上如何做Base的编码与解码(decoder)?可分为两个时期。

       æ—©æœŸåšæ³•ï¼š

        早期在Java上做Base的编码与解码,会使用到JDK里sun.misc套件下的BASEEncoder和BASEDecoder这两个类别,用法如下:

        final BASEEncoder encoder = new BASEEncoder();  final BASEDecoder decoder = new BASEDecoder();  final String text = "字串文字";  final byte[] textByte = text.getBytes("UTF-8");  //编码  final String encodedText = encoder.encode(textByte);  System.out.println(encodedText);  //解码  System.out.println(new String(decoder.decodeBuffer(encodedText), "UTF-8"));

        后期做法:

        在Java 8的java.util套件中,新增了Base的类别,可以用来处理Base的编码与解码,用法如下: package com.lmp.utils; import sun.misc.BASEDecoder; import sun.misc.BASEEncoder; public class test {     public static void main(String[] args) throws Exception {         String str = "hello word";         BASEEncoder baseEncoder = new BASEEncoder();         // JDK1.8 BASEEncoder åŠ å¯†         String encode = baseEncoder.encode(str.getBytes());         System.out.println(encode);         BASEDecoder baseDecoder = new BASEDecoder();         // JDK1.8 BASEDecoder è§£å¯†         byte[] bytes = baseDecoder.decodeBuffer(encode);         String res = new String(bytes);         System.out.println(res);     } }

Java中用Base编程的文件批量加密解密工具程序代码

       /** * BASE解密 * * @param key * @return * @throws Exception */

       public static byte[] decryptBASE(String key) throws Exception { return (new BASEDecoder()).decodeBuffer(key); } /** * BASE加密 * * @param key * @return * @throws Exception */ public static String encryptBASE(byte[] key) throws Exception { return (new BASEEncoder()).encodeBuffer(key); }

如何使用JAVA实现对字符串的DES加密和解密

       /

**

        * ECB模式的des加密,以base的编码输出

        * @param message

        * @param key

        * @return

        * @throws Exception

        */

         public static String desEncrypt(String message, String key)throws Exception{

           // DES/ECB CBC CFB OFB /PKCS5Padding  NoPadding  åŠ å¯†/模式/填充

           Cipher cipher = Cipher.getInstance("DES");//默认就是 DES/ECB/PKCS5Padding

           DESKeySpec desKeySpec = new DESKeySpec(key.getBytes());

           SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

           SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

           cipher.init(1, secretKey);

          return new BASEEncoder().encode(cipher.doFinal(message.getBytes("UTF-8")));

         }

         /

**

          * ECB模式的des解密

          * @param message

          * @param key

          * @return

          * @throws Exception

          */

         public static String desDecrypt(String message, String key)throws Exception{

           Cipher cipher = Cipher.getInstance("DES");

           DESKeySpec desKeySpec = new DESKeySpec(key.getBytes());

           SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

           SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

           cipher.init(2, secretKey);

           return new String(cipher.doFinal(Base.decode(message)), "UTF-8");

         }

       ä½ è‡ªå·±å†™main方法测试一下,应该是没问题的

Base编码解码原理

       Base编码与解码原理涉及的算法1、短除法

       çŸ­é™¤æ³•è¿ç®—方法是先用一个除数除以能被它除尽的一个质数,以此类推,除到商是质数为止。通过短除法,十进制数可以不断除以2得到多个余数。最后,将余数从下到上进行排列组合,得到二进制数。

       å®žä¾‹ï¼šä»¥å­—符n对应的ascII编码为例。

/ 2= .../ 2= .../ 2= .../ 2= 6... / 2= 3... / 2= 1... / 2= 0...1

       å°†ä½™æ•°ä»Žä¸‹åˆ°ä¸Šè¿›è¡ŒæŽ’列组合,得到字符n对应的ascII编码转二进制为,因为一字节对应8位(bit), 所以需要向前补0补足8位,得到。其余字符同理可得。

2、按权展开求和

       æŒ‰æƒå±•å¼€æ±‚å’Œ, 8位二进制数从右到左,次数是0到7依次递增, 基数底数次数,从左到右依次累加,相加结果为对应十进制数。我们已二进制数转进制为例: $$ ()_2 = ^0 + ^ 1 + ^2 + ^3 + ^4 + ^5 + ^6 + 0 * 2^7 $$

3、位概念

       äºŒè¿›åˆ¶æ•°ç³»ç»Ÿä¸­ï¼Œæ¯ä¸ª0或1就是一个位(bit,比特),也叫存储单元,位是数据存储的最小单位。其中 8bit 就称为一个字节(Byte)。

4、移位运算符

       ç§»ä½è¿ç®—符在程序设计中,是位操作运算符的一种。移位运算符可以在二进制的基础上对数字进行平移。按照平移的方向和填充数字的规则分为三种:<<(左移)、>>(带符号右移)和>>>(无符号右移)。在base的编码和解码过程中操作的是正数,所以仅使用<<(左移)、>>(带符号右移)两种运算符。

       å·¦ç§»è¿ç®—:是将一个二进制位的操作数按指定移动的位数向左移动,移出位被丢弃,右边移出的空位一律补0。【左移相当于一个数乘以2的次方】

       å³ç§»è¿ç®—:是将一个二进制位的操作数按指定移动的位数向右移动,移出位被丢弃,左边移出的空位一律补0,或者补符号位,这由不同的机器而定。在使用补码作为机器数的机器中,正数的符号位为0,负数的符号位为1。【右移相当于一个数除以2的次方】

// 左移 << 2 -> (左侧移出位被丢弃) -> (右侧空位一律补0)// 右移 >> 2 -> (右侧移出位被丢弃) -> (左侧空位一律补0)5、与运算、或运算

       ä¸Žè¿ç®—、或运算都是计算机中一种基本的逻辑运算方式。

       ä¸Žè¿ç®—:符号表示为&。运算规则:两位同时为“1”,结果才为“1”,否则为0

       æˆ–运算:符号表示为|。运算规则:两位只要有一位为“1”,结果就为“1”,否则为0

什么是base编码

       $$\ 2^6=\ $$

       \

       Base编码是将字符串以每3个8比特(bit)的字节子序列拆分成4个6比特(bit)的字节(6比特有效字节,最左边两个永远为0,其实也是8比特的字节)子序列,再将得到的子序列查找Base的编码索引表,得到对应的字符拼接成新的字符串的一种编码方式。

       æ¯3个8比特(bit)的字节子序列拆分成4个6比特(bit)的字节的拆分过程如下图所示:

为什么base编码后的大小是原来的4/3倍

       å› ä¸º6和8的最大公倍数是,所以3个8比特的字节刚好可以拆分成4个6比特的字节,3 x 8 = 6 x 4。计算机中,因为一个字节需要8个存储单元存储,所以我们要把6个比特往前面补两位0,补足8个比特。如下图所示:

       è¡¥è¶³åŽæ‰€éœ€çš„存储单元为个,是原来所需的个的4/3倍。这也就是base编码后的大小是原来的4/3倍的原因。

为什么命名为base呢?

       å› ä¸º6位(bit)的二进制数有2的6次方个,也就是二进制数(-)之间的代表0-的个二进制数。

不是说一个字节是用8位二进制表示的吗,为什么不是2的8次方?

       å› ä¸ºæˆ‘们得到的8位二进制数的前两位永远是0,真正的有效位只有6位,所以我们所能够得到的二进制数只有2的6次方个。

Base字符是哪个?

       Base的编码索引表,字符选用了"A-Z、a-z、0-9、+、/" 个可打印字符来代表(-)这个二进制数。即

let baseEncodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/'编码原理

       è¦æŠŠ3个字节拆分成4个字节可以怎么做?

流程图思路

       åˆ†æžæ˜ å°„关系:abc → xyzi。我们从高位到低位添加索引来分析这个过程

       x: (前面补两个0)a的前六位 => a7a6a5a4a3a2

       y: (前面补两个0)a的后两位 + b的前四位 => a1a0b7b6b5b4

       z: (前面补两个0)b的后四位 + c的前两位 => b3b2b1b0c7c6

       i: (前面补两个0)c的后六位 => c5c4c3c2c1c0

       é€šè¿‡ä¸Šè¿°çš„映射关系,得到实现思路:

       å°†å­—符对应的AscII编码转为8位二进制数

       å°†æ¯ä¸‰ä¸ª8位二进制数进行以下操作

       å°†ç¬¬ä¸€ä¸ªæ•°å³ç§»ä½2位,得到第一个6位有效位二进制数

       å°†ç¬¬ä¸€ä¸ªæ•° & 0x3之后左移位4位,得到第二个6位有效位二进制数的第一个和第二个有效位,将第二个数 & 0xf0之后右移位4位,得到第二个6位有效位二进制数的后四位有效位,两者取且得到第二个6位有效位二进制

       å°†ç¬¬äºŒä¸ªæ•° & 0xf之后左移位2位,得到第三个6位有效位二进制数的前四位有效位,将第三个数 & 0xC0之后右移位6位,得到第三个6位有效位二进制数的后两位有效位,两者取且得到第三个6位有效位二进制

       å°†ç¬¬ä¸‰ä¸ªæ•° & 0x3f,得到第四个6位有效位二进制数

       å°†èŽ·å¾—çš„6位有效位二进制数转十进制,查找对呀base字符

代码实现

       ä»¥hao字符串为例,观察base编码的过程,将上面转换通过代码逻辑分析实现

// 输入字符串let str = 'hao'// base字符串let baseEncodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/'// 定义输入、输出字节的二进制数let char1, char2, char3, out1, out2, out3, out4, out// 将字符对应的ascII编码转为8位二进制数char1 = str.charCodeAt(0) & 0xff // char2 = str.charCodeAt(1) & 0xff // char3 = str.charCodeAt(2) & 0xff // // 输出6位有效字节二进制数out1 = char1 >> 2 // out2 = (char1 & 0x3) << 4 | (char2 & 0xf0) >> 4 // out3 = (char2 & 0xf) << 2 | (char3 & 0xc0) >> 6 // out4 = char3 & 0x3f // out = baseEncodeChars[out1] + baseEncodeChars[out2] + baseEncodeChars[out3] + baseEncodeChars[out4] // aGFv算法剖析

       out1: char1 >> 2

->

       out2 = (char1 & 0x3) << 4 | (char2 & 0xf0) >> 4

// 且运算----------------// 移位运算后得// 或运算--------

       ç¬¬ä¸‰ä¸ªå­—符第四个字符同理

       æ•´ç†ä¸Šè¿°ä»£ç ï¼Œæ‰©å±•è‡³å¤šå­—符字符串

// 输入字符串let str = 'haohaohao'// base字符串let baseEncodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/'// 获取字符串长度let len = str.length// 当前字符索引let index = 0// 输出字符串let out = ''while(index < len) { // 定义输入、输出字节的二进制数let char1, char2, char3, out1, out2, out3, out4// 将字符对应的ascII编码转为8位二进制数char1 = str.charCodeAt(index++) & 0xff // char2 = str.charCodeAt(index++) & 0xff // char3 = str.charCodeAt(index++) & 0xff // // 输出6位有效字节二进制数out1 = char1 >> 2 // out2 = (char1 & 0x3) << 4 | (char2 & 0xf0) >> 4 // out3 = (char2 & 0xf) << 2 | (char3 & 0xc0) >> 6 // out4 = char3 & 0x3f // out = out + baseEncodeChars[out1] + baseEncodeChars[out2] + baseEncodeChars[out3] + baseEncodeChars[out4] // aGFv}

       åŽŸå­—符串长度不是3的整倍数的情况,需要特殊处理

...char1 = str.charCodeAt(index++) & 0xff // if (index == len) { out2 = (char1 & 0x3) << 4out = out + baseEncodeChars[out1] + baseEncodeChars[out2] + '=='return out}char2 = str.charCodeAt(index++) & 0xff // if (index == len) { out1 = char1 >> 2 // out2 = (char1 & 0x3) << 4 | (char2 & 0xf0) >> 4 // out3 = (char2 & 0xf) << 2out = out + baseEncodeChars[out1] + baseEncodeChars[out2] + baseEncodeChars[out3] + '='return out}...

       å…¨éƒ¨ä»£ç 

function baseEncode(str) { // base字符串let baseEncodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/'// 获取字符串长度let len = str.length// 当前字符索引let index = 0// 输出字符串let out = ''while(index < len) { // 定义输入、输出字节的二进制数let char1, char2, char3, out1, out2, out3, out4// 将字符对应的ascII编码转为8位二进制数char1 = str.charCodeAt(index++) & 0xffout1 = char1 >> 2if (index == len) { out2 = (char1 & 0x3) << 4out = out + baseEncodeChars[out1] + baseEncodeChars[out2] + '=='return out}char2 = str.charCodeAt(index++) & 0xffout2 = (char1 & 0x3) << 4 | (char2 & 0xf0) >> 4 if (index == len) { out3 = (char2 & 0xf) << 2out = out + baseEncodeChars[out1] + baseEncodeChars[out2] + baseEncodeChars[out3] + '='return out}char3 = str.charCodeAt(index++) & 0xff// 输出6位有效字节二进制数out3 = (char2 & 0xf) << 2 | (char3 & 0xc0) >> 6out4 = char3 & 0x3fout = out + baseEncodeChars[out1] + baseEncodeChars[out2] + baseEncodeChars[out3] + baseEncodeChars[out4]}return out}baseEncode('haohao') // aGFvaGFvbaseEncode('haoha') // aGFvaGE=baseEncode('haoh') // aGFvaA==解码原理

       é€†å‘推导,由每4个6位有效位的二进制数合并成3个8位二进制数,根据ascII编码映射到对应字符后拼接字符串

思路

       åˆ†æžæ˜ å°„关系 xyzi -> abc

       a: x后六位 + y第三、四位 => x5x4x3x2x1x0y5y4

       b: y后四位 + z第三、四、五、六位 => y3y2y1y0z5z4z3z2

       c: z后两位 + i后六位 => z1z0i5i4i3i2i1i0

       å°†å­—符对应的base字符集的索引转为6位有效位二进制数

       å°†æ¯å››ä¸ª6位有效位二进制数进行以下操作

       ç¬¬ä¸€ä¸ªäºŒè¿›åˆ¶æ•°å·¦ç§»ä½2位,得到新二进制数的前6位,第二个二进制数 & 0x之后右移位4位,取或集得到第一个新二进制数

       ç¬¬äºŒä¸ªäºŒè¿›åˆ¶æ•° & 0xf之后左移位4位,第三个二进制数 & 0x3c之后右移位2位,取或集得到第二个新二进制数

       ç¬¬äºŒä¸ªäºŒè¿›åˆ¶æ•° & 0x3之后左移位6位,与第四个二进制数取或集得到第二个新二进制数

       æ ¹æ®ascII编码映射到对应字符后拼接字符串

代码实现// base字符串let str = 'aGFv'// base字符集let baseCharsArr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/'.split('')// 获取索引值let char1 = baseCharsArr.findIndex(char => char==str[0]) & 0xff // let char2 = baseCharsArr.findIndex(char => char==str[1]) & 0xff // let char3 = baseCharsArr.findIndex(char => char==str[2]) & 0xff // let char4 = baseCharsArr.findIndex(char => char==str[3]) & 0xff // let out1, out2, out3, out// 位运算out1 = char1 << 2 | (char2 & 0x) >> 4out2 = (char2 & 0xf) << 4 | (char3 & 0x3c) >> 2out3 = (char3 & 0x3) << 6 | char4console.log(out1, out2, out3)out = String.fromCharCode(out1) + String.fromCharCode(out2) + String.fromCharCode(out3)

       é‡åˆ°æœ‰ç”¨'='补过位的情况时

// 左移 << 2 -> (左侧移出位被丢弃) -> (右侧空位一律补0)// 右移 >> 2 -> (右侧移出位被丢弃) -> (左侧空位一律补0)0

       è§£ç æ•´ä¸ªå­—符串,整理代码后

// 左移 << 2 -> (左侧移出位被丢弃) -> (右侧空位一律补0)// 右移 >> 2 -> (右侧移出位被丢弃) -> (左侧空位一律补0)1

       ä¸Šè¿°è§£ç æ ¸å¿ƒæ˜¯å­—符与base字符集索引的映射,网上看到过使用AscII编码索引映射base字符索引的方法

// 左移 << 2 -> (左侧移出位被丢弃) -> (右侧空位一律补0)// 右移 >> 2 -> (右侧移出位被丢弃) -> (左侧空位一律补0)2

       ç”±æ­¤å¯è§ï¼ŒbaseDecodeChars对照accII编码表的索引存放的是base编码表的对应字符的索引。

jdk1.8之前的方式

       Base编码与解码时,会使用到JDK里sun.misc包套件下的BASEEncoder类和BASEDecoderç±»

       sun.misc包所提供的Base编码解码功能效率不高,因此在1.8之后的jdk版本已经被删除了

// 左移 << 2 -> (左侧移出位被丢弃) -> (右侧空位一律补0)// 右移 >> 2 -> (右侧移出位被丢弃) -> (左侧空位一律补0)3Apache Commons Codec包的方式

       Apache Commons Codec 有提供Base的编码与解码功能,会使用到 org.apache.commons.codec.binary 套件下的Base类别,用法如下

       1、引入依赖

// 左移 << 2 -> (左侧移出位被丢弃) -> (右侧空位一律补0)// 右移 >> 2 -> (右侧移出位被丢弃) -> (左侧空位一律补0)4

       2、代码实现

// 左移 << 2 -> (左侧移出位被丢弃) -> (右侧空位一律补0)// 右移 >> 2 -> (右侧移出位被丢弃) -> (左侧空位一律补0)5jdk1.8之后的方式

       ä¸Žsun.misc包和Apache Commons Codec所提供的Base编解码器方式来比较,Java 8提供的Base拥有更好的效能。实际测试编码与解码速度,Java 8提供的Base,要比 sun.misc 套件提供的还要快至少倍,比 Apache Commons Codec 提供的还要快至少3倍。

// 左移 << 2 -> (左侧移出位被丢弃) -> (右侧空位一律补0)// 右移 >> 2 -> (右侧移出位被丢弃) -> (左侧空位一律补0)6总结

       Base 是一种数据编码方式,可做简单加密使用,可以t通过改变base编码映射顺序来形成自己独特的加密算法进行加密解密。

编码表Base编码表AscII码编码表原文:/post/