package com.zd.demo;
import org.apache.commons.codec.CharEncoding;
import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.EncoderException;
import org.apache.commons.codec.binary.Base32;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.BinaryCodec;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.codec.language.Metaphone;
import org.apache.commons.codec.language.RefinedSoundex;
import org.apache.commons.codec.language.Soundex;
import org.apache.commons.codec.net.BCodec;
import org.apache.commons.codec.net.QCodec;
import org.apache.commons.codec.net.URLCodec;
import org.junit.Before;
import org.junit.Test;
import java.io.UnsupportedEncodingException;
import static org.junit.Assert.assertEquals;
public class CommonsCodecTest {
private String plaintext;
private String base32Ciphertext;
private String base64Ciphertext;
private String binarytext;
private String hexCiphertext;
private String md5Ciphertext;
private String shaCiphertext;
private String bCodectext;
private String qCodectext;
private String uRLCodectext;
@Before
public void setup() {
plaintext = "hello world...";
base32Ciphertext = "NBSWY3DPEB3W64TMMQXC4LQ=";
base64Ciphertext = "aGVsbG8gd29ybGQuLi4=";
hexCiphertext = "68656c6c6f20776f726c642e2e2e";
binarytext = "0010111000101110001011100110010001101100011100100110111101110111001000000110111101101100011011000110010101101000";
md5Ciphertext = "c95f105ab2434587045d9cf1e79ee9ef";
shaCiphertext = "09979ca598482cc43df62914f11168e97d7314bf";
bCodectext = "=?UTF-8?B?aGVsbG8gd29ybGQuLi4=?=";
qCodectext = "=?UTF-8?Q?hello world...?=";
uRLCodectext = "hello+world...";
}
/**
* 编码规则:任意给定一个二进制数据,以5个位(bit)为一组进行切分(base64以6个位(bit)为一组),
* 对切分而成的每个组进行编码得到1个可见字符。Base32编码表字符集中的字符总数为2^5=32个
* 编码表:
* [0-31]
* [A-Z 2-7]
* 步骤如下:
* 1)字符“bhst”取ASCII码之后,对其转换成二进制得到“1100010,1101000,1110011,1110100,”共四个字节,28个bit的二进制串。
* 注:因为base32是属于传输8bit字节代码的编码方式,所以这里要对“bhst”字符串对应的二进制最高位加0变成每组8个bit。
* 组成32个bit的二进制串。
* 2)以5个bit为一组对“bhst”字符串对应的二进制串进行切分。得到“01100,01001,10100,00111,00110,11101,00000”7个字节的“bhst”二进制串。
* 注:每组的二进制串不足5个用0补充。
* 3)计算每组二进制串所对应的十进制,然后参考标准Base32编码表,找出所对应的编码字符,组合成密文。
* 注:最后一个分组位数不足4个的时候,则用字符“=”编码。
*/
@Test
public void base32Test() {
Base32 base32 = new Base32();
String ciphertext = base32.encodeAsString(plaintext.getBytes());
assertEquals(base32Ciphertext, ciphertext);
String cleartext = new String(base32.decode(base32Ciphertext));
assertEquals(plaintext, cleartext);
}
/**
* 编码规则:
* 64个字符用6个bit位就可以全部表示,一个字节有8个bit 位,剩下两个bit就浪费掉了,这样就不得不牺牲一部分空间了。
* 这里需要弄明白的就是一个Base64字符是8个bit,但是有效部分只有右边的6个 bit,左边两个永远是0。
* 编码表:
* [0-63]
* [A-Z a-z 0-9 + /]
* 编码原理:
* 将3个字节转换成4个字节( (3 X 8) = 24 = (4 X 6) )先读入3个字节,每读一个字节,左移8位,再右移四次,每次6位,这样就有4个字节了
* 解码原理:
* 将4个字节转换成3个字节.先读入4个6位(用或运算),每次左移6位,再右移3次,每次8位.这样就还原了.
* 注意:
* 面提到编码是以3个字节为单位,当剩下的字符数量不足3个字节时,则应使用0进行填充,相应的,输出字符则使用'='占位,因此编码后输出的文本末尾可能会出现1至2个'='。
*/
@Test
public void base64Test() {
Base64 base64 = new Base64();
String ciphertext = base64.encodeAsString(plaintext.getBytes());
assertEquals(base64Ciphertext, ciphertext);
String cleartext = new String(base64.decode(base64Ciphertext));
assertEquals(plaintext, cleartext);
}
/**
* hex
*/
@Test
public void hexTest() throws EncoderException, DecoderException {
Hex hex = new Hex();
String ciphertext = new String(hex.encode(plaintext.getBytes()));
assertEquals(hexCiphertext,ciphertext);
String cleartext = new String(hex.decode(hexCiphertext.getBytes()));
assertEquals(plaintext,cleartext);
}
/**
* 二进制编码
*/
@Test
public void binaryCodecTest(){
BinaryCodec binaryCodec = new BinaryCodec();
String ciphertext = new String(binaryCodec.encode(plaintext.getBytes()));
assertEquals(binarytext,ciphertext);
String cleartext = new String(binaryCodec.decode(binarytext.getBytes()));
assertEquals(plaintext,cleartext);
}
/**
* md5加密算法
*/
@Test
public void md5HexTest() {
String cipherText = DigestUtils.md5Hex(plaintext);
assertEquals(md5Ciphertext, cipherText);
}
/**
* sha1加密算法
*/
@Test
public void shaTest() {
String cipherText = DigestUtils.sha1Hex(plaintext.getBytes());
assertEquals(shaCiphertext, cipherText);
}
/**
* Metaphone及Soundex编码
*
* Metaphone 建立出相同的key给发音相似的单字, 比 Soundex 还要准确, 但是 Metaphone 没有固定长度, Soundex 则是固定第一个英文字加上3个数字. 这通常是用在类似音比对, 也可以用在 MP3 的软件开发.
*
* Soundex 算法的运作方式是把某个字母表中的每个字母映射成代表它的语音组的一个数字代码。在这个方案里,像 d和 t这样的字母在同一个组里,因为它们发音相近(实际上每个字母都是用类似的机制发出声音的),而元音则一概忽略。通过对整体单词应用这种映射,就产生了单词的语音“键”。发音相近的单词通常会有相同的键。
*
* Metaphone算法明确地对英语发音的公共规则进行了编码,而这正是 Soundex 没有解决的问题。
*/
@Test
public void languageTest(){
Metaphone metaphone = new Metaphone();
RefinedSoundex refinedSoundex = new RefinedSoundex();
Soundex soundex = new Soundex();
for (int i = 0; i < 2; i++) {
String str = (i == 0) ? "resume" : "resin";
String mString = null;
String rString = null;
String sString = null;
try {
mString = metaphone.encode(str);
rString = refinedSoundex.encode(str);
sString = soundex.encode(str);
} catch (Exception ex) {
}
System.out.println("Original:" + str);
System.out.println("Metaphone:" + mString);
System.out.println("RefinedSoundex:" + rString);
System.out.println("Soundex:" + sString + "\n");
}
}
/**
*BCodec
*/
@Test
public void bCodecTest() throws EncoderException, DecoderException {
BCodec bCodec = new BCodec();
String ciphertext = bCodec.encode(plaintext, CharEncoding.UTF_8);
assertEquals(bCodectext,ciphertext);
String cleartext = bCodec.decode(ciphertext);
assertEquals(plaintext,cleartext);
}
/**
* QCodec
*/
@Test
public void QCodecTest() throws EncoderException, DecoderException {
QCodec qCodec = new QCodec();
String ciphertext = qCodec.encode(plaintext, CharEncoding.UTF_8);
assertEquals(qCodectext,ciphertext);
String cleartext = qCodec.decode(ciphertext);
assertEquals(plaintext,cleartext);
}
/**
* url编码解码
*/
@Test
public void URLCodecTest() throws UnsupportedEncodingException, DecoderException {
URLCodec urlCodec = new URLCodec();
String ciphertext = urlCodec.encode(plaintext,CharEncoding.UTF_8);
assertEquals(uRLCodectext,ciphertext);
String cleartext = urlCodec.decode(ciphertext);
assertEquals(plaintext,cleartext);
}
}
分享到:
相关推荐
易语言Base64编解码新汇编源码是一个针对易语言编程环境的代码资源,主要功能是实现Base64编码和解码。Base64是一种用于将任意二进制数据转换为可打印字符的编码方式,常用于在网络上传输包含二进制的数据,如图片或...
常见的设计是提供两个函数,如`base64_encode`和`base64_decode`,分别处理编码和解码操作。函数通常接受字节流作为输入,并返回对应的Base64字符串或解码后的字节流。 3. **编码实现**:编码过程可能包括以下步骤...
function Base64ToImage(const base64:string;AImage:TImage):Boolean; function Base64ToImageFile(const base64:string;AImagefile:string):Boolean; function CheckImgTypeBase64(abase64:string):string;
通过阅读和分析这些源码,你可以了解到具体是如何用易语言汇编实现Base64编码和解码的细节。这种实践经验对于深入理解易语言、汇编语言以及Base64编码机制非常有帮助。你可以学习如何在实际编程中运用这些概念和技术...
2. JSON Web Tokens (JWT):JWT通常以Base64编码,前端可以解析其中的payload来获取用户信息。 3. 跨域请求:在CORS策略限制下,可以在Ajax请求的头信息中携带Base64编码的认证信息。 四、自定义Base64库 考虑到...
在你提供的资源中,“c++ base64加密解密源码”包含了Base64编码和解码功能的实现,这对理解Base64的工作原理以及如何在C++中实现它非常有帮助。 Base64的基本原理是将每3个8位字节的数据块(24位)转换为4个6位的...
包含的两个文件"BASE64_TO_IMAGE.exe"是实际的执行程序,用户可以直接运行进行Base64和图片的转换操作;"1.png"可能是示例图片或用于演示如何使用该工具的说明图。 总的来说,"Base64转图片"工具利用MFC提供的功能...
综上,这个“手机app base64选择图片上传 demo”涵盖了移动端开发的多个关键环节,对于初学者来说,这是一个很好的实践项目,可以帮助他们理解并掌握在MUI框架下实现图片选择和上传功能的完整流程。同时,对于有经验...
首先,Base64编码是基于64个字符的集合,包括大小写字母、数字和两个特殊字符("+"和"/"),以及一个分隔符("=")。这是因为标准ASCII字符集中有64个这样的字符,它们可以无混淆地表示任何二进制数据的每6个比特。...
易语言Base64转换JS版源码是一种编程技术的应用,主要涉及两个方面:易语言(E语言)和JavaScript。易语言是中国本土开发的一种简单易学的编程语言,旨在降低编程难度,让更多人能够进行计算机程序设计。而Base64是...
本文将详细探讨如何在Hive中自定义User Defined Function(UDF)来实现Base64的加密和解密。 首先,我们需要了解Base64的基本原理。Base64是一种将任意二进制数据转化为ASCII字符集的方法,它通过将每3个字节转换为...
Unity有内置的JSON序列化支持,可以用来接收和解析JavaScript发送的base64字符串。然后,Unity可以将这些数据写入本地文件,例如: ```csharp using System.IO; using UnityEngine; public class ReceiveAudio : ...
"图片与Base64加密码字符串相互转换工具 带源码" 意味着提供给用户的不仅仅是可执行的应用程序,还包括了源代码。源代码的提供对于开发者来说具有很高的价值,因为这允许他们查看和理解内部的工作机制,甚至可以根据...
获取任意文件的base64字符串源码,js版。
这个文件已发现有错误,请下载“效率优化及纠错版本”,就在上面。...我用pb9写的一个BASE64加解密对象,可以对任意文件进行加解密,也可以对文本进行加解密。不过,PB做这种事实在是力不从心,效率惨不忍睹啊。
在IT领域,基础编码技术是数据传输和存储中不...在实际项目中,这种技术常用于在网络上传输二进制文件,如图片、音频和视频等,因为这些文件不能直接以文本形式展示,而Base64编码后的结果可以被大部分系统接受和解析。
Base64是一种用于在电子邮件和其他需要文本格式传输二进制数据的编码方式。在Web开发中,Base64编码常用于在HTML或JavaScript中嵌入图像,因为它可以把图片数据转化为可直接在源代码中使用的文本形式。 【描述解读...
具体来说,前两个Base64字符分别由第1个和第2个字节计算得出,第三个Base64字符由第2个和第3个字节计算得出,最后一个Base64字符完全由第3个字节决定。 4. **填充等号**:如果最后一组数据不足3个字节,则使用等号`=...
易语言是一种专为中国人设计的...总的来说,这个压缩包提供的资料为我们提供了一个深入学习易语言和BASE64编码的实践案例,通过对源码的解析和测试,我们可以提升自己的编程技能,特别是对于数据编码和性能优化的理解。
文件base64编码解码,小例子,文件名需修改源码,系统不支持免