VB Base64编码与解码函数
VBA中的数据加密和解密技巧和函数介绍
VBA中的数据加密和解密技巧和函数介绍在现代信息时代,数据安全性变得尤为重要。
为了保护敏感数据免受未经授权的访问,许多组织和个人采取了各种措施来加密和解密数据。
在VBA(Visual Basic for Applications)中,也有一些强大的技巧和函数来实现数据的加密和解密。
本文将介绍一些常用的VBA数据加密和解密技巧和函数。
一、数据加密技巧1. 使用简单的替换法加密:这是最基本的加密方式之一。
它通过将字符替换为其他字符或数字来实现加密。
例如,将字母A替换为数字1,字母B替换为数字2,以此类推。
这种加密方法的优点是简单易懂,但是安全性较低,容易被破解。
2. 使用位运算加密:位运算是通过对数据的二进制表示进行操作来实现的。
例如,可以将数据与特定的位掩码进行逐位比较,并根据结果进行加密。
这种加密方法相对较安全,但也需要更高级的知识和理解。
3. 使用对称加密算法:对称加密算法使用相同的密钥进行加密和解密。
常见的对称加密算法包括AES(Advanced Encryption Standard)和DES(Data Encryption Standard)。
VBA中可以使用CryptoAPI(Cryptographic Application Programming Interface)来实现对称加密。
二、数据解密技巧1. 使用简单的替换法解密:与加密过程相反,可以通过将字符替换为原始的字符或数字来解密数据。
例如,将数字1替换为字母A,数字2替换为字母B,以此类推。
2. 使用位运算解密:通过对加密后的数据与位掩码进行逐位比较,并根据结果进行解密。
与加密过程相反,这种方法需要对加密算法有深入的理解和知识。
3. 使用对称解密算法:对称解密算法使用相同的密钥进行解密。
与加密过程相反,解密算法将对加密后的数据进行解密,将其还原为原始的数据。
三、常用的VBA加密和解密函数介绍1. Environ函数:该函数可以返回操作系统的环境变量的值。
在数据库中实现base64编码和解码
在数据库中实现base64编码和译码作者:Thursday, April 1 2004 10:49 AMMIME标准定义了一种编码,我们称之为base64。
这个标准定义了一系列的ASCII字符来描述64个特定值。
在许多早期的HTTP网络服务器中,在HTTP的认证中的密码一般都使用base64进行编码的。
在数据库内能把二进制的数据编码或者解码成base64文本就可以用存储过程从e-mail和HTTP服务器认证发送数据并解码。
Oracle9i就支持一个能对base64进行编码和解码的PL/SQL的包,这就像uuencode和绰号引起来的可打印格式一样,具体操作例如以下代码:SQL> select utl_encode.base64_encode(hextoraw('0102')) from dual;4151493DSQL> select utl_encode.base64_decode(hextoraw('4151493D')) from dual;0102这些函数的返回结果是一个RA W函数,所以你需要采用UTL_RA W.CAST_TO_V ARCHAR来把它作为V ARCHAR2型结果来使用。
如果你不用CAST_TO_V ARCHAR的话,数据可将自动的将这些RA W值转化为十六进制数据:SQL>select utl_raw.cast_to_varchar2_(utl_encode.base64_encode(hextoraw('0102')))from dual;AQI=当然,在Java中也提供了许多能有效对base64进行编码解码的类,任何一个都能用做存储过程,有了UTL_RA W的帮助,在纯PL/SQL方式下编码方法写起来就非常简单了(这种编码方法在Oracle8中也可以用)。
代码A现在当需要对base64进行编码的时候,你应该能将其来回的转换::SQL> select base64.encode(hextoraw('0102')) from dual;AQI=SQL> select base64.decode('AQI=') from dual;0102create or replace package base64asfunction encode(p_raw in raw) return varchar2;function decode(p_base64 in varchar2) return raw;end base64;/show errors;create or replace package body base64asg_base64 varchar2(64) :='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 0123456789+/'; --function encode(p_raw in raw) return varchar2isl_len pls_integer;l_hex varchar2(6);l_result varchar2(32767);-- base64 valuesb1 pls_integer;b2 pls_integer;b3 pls_integer;b4 pls_integer;-- raw bytesr1 pls_integer;r2 pls_integer;r3 pls_integer;beginl_len := utl_raw.length(p_raw);for i in 0 .. trunc(l_len / 3)-1 loopl_hex := rawtohex(utl_raw.substr(p_raw,(i*3)+1,3)); -- get 3 binary bytesr1 := to_number(substr(l_hex,1,2),'FM0X');r2 := to_number(substr(l_hex,3,2),'FM0X');r3 := to_number(substr(l_hex,5,2),'FM0X');-- convert into base64 charactersb1 := trunc(r1/4);b2 := (bitand(r1,3) * 16) + trunc(r2/16);b3 := (bitand(r2,15) * 4) + trunc(r3/64);b4 := bitand(r3,63);l_result := l_result|| substr(g_base64,b1+1,1)|| substr(g_base64,b2+1,1)|| substr(g_base64,b3+1,1)|| substr(g_base64,b4+1,1);end loop;if mod(l_len,3) = 1 thenl_hex := rawtohex(utl_raw.substr(p_raw,l_len-1,1)); r1 := to_number(l_hex,'FM0X');b1 := trunc(r1/4);b2 := bitand(r1,3) * 16;l_result := l_result|| substr(g_base64,b1+1,1)|| substr(g_base64,b2+1,1)|| '==';elsif mod(l_len,3) = 2 thenl_hex := rawtohex(utl_raw.substr(p_raw,l_len-2,2)); r1 := to_number(substr(l_hex,1,2),'FM0X');r2 := to_number(substr(l_hex,3,2),'FM0x');b1 := trunc(r1/4);b2 := (bitand(r1,3) * 16) + trunc(r2/16);b3 := bitand(r2,15) * 4;l_result := l_result|| substr(g_base64,b1+1,1)|| substr(g_base64,b2+1,1)|| substr(g_base64,b3+1,1)|| '=';end if;return l_result;end encode;--function decode(p_base64 in varchar2) return rawisl_len pls_integer;l_base64 varchar2(32767) := p_base64;l_raw raw(24576);-- base64 valuesb1 pls_integer;b2 pls_integer;b3 pls_integer;b4 pls_integer;-- raw bytesr1 pls_integer;r2 pls_integer;r3 pls_integer;beginl_base64 := replace(l_base64,chr(10)||chr(13),null);l_base64 := rtrim(l_base64,'=');l_len := length(l_base64);for i in 0 .. trunc(l_len / 4)-1 loop-- retrieve 4 base64 values (6-bit)b1 := instr(g_base64,substr(l_base64,(i*4)+1,1))-1;b2 := instr(g_base64,substr(l_base64,(i*4)+2,1))-1;b3 := instr(g_base64,substr(l_base64,(i*4)+3,1))-1;b4 := instr(g_base64,substr(l_base64,(i*4)+4,1))-1;-- bit manipulate into 8-bit valuesr1 := (b1 * 4) + trunc(b2 / 16);r2 := (bitand(b2,15) * 16) + trunc(b3 / 4);r3 := (bitand(b3,3) * 64) + b4;-- concatenate result with raw bytesl_raw := utl_raw.concat(l_raw,hextoraw(to_char(r1,'FM0X')||to_char(r2,'FM0X')||to_char(r3,'FM0X'))); end loop;if mod(l_len,4) = 2 thenb1 := instr(g_base64,substr(l_base64,l_len-1,1))-1;b2 := instr(g_base64,substr(l_base64,l_len,1))-1;r1 := (b1 * 4) + trunc(b2 / 16);l_raw := utl_raw.concat(l_raw,hextoraw(to_char(r1,'FM0X'))); elsif mod(l_len,4) = 3 thenb1 := instr(g_base64,substr(l_base64,l_len-2,1))-1;b2 := instr(g_base64,substr(l_base64,l_len-1,1))-1;b3 := instr(g_base64,substr(l_base64,l_len,1))-1;r1 := (b1 * 4) + trunc(b2 / 16);r2 := (bitand(b2,15) * 16) + trunc(b3 / 4);l_raw := utl_raw.concat(l_raw,hextoraw(to_char(r1,'FM0X')||to_char(r2,'FM0X')));end if;return l_raw;end decode;end base64;/。
Base64编码与解码原理
Base64编码与解码原理Base64编码是使⽤64个可打印ASCII字符(A-Z、a-z、0-9、+、/)将任意字节序列数据编码成ASCII字符串,另有“=”符号⽤作后缀⽤途。
base64索引表base64编码与解码的基础索引表如下base64编码原理(1)base64编码过程Base64将输⼊字符串按字节切分,取得每个字节对应的⼆进制值(若不⾜8⽐特则⾼位补0),然后将这些⼆进制数值串联起来,再按照6⽐特⼀组进⾏切分(因为2^6=64),最后⼀组若不⾜6⽐特则末尾补0。
将每组⼆进制值转换成⼗进制,然后在上述表格中找到对应的符号并串联起来就是Base64编码结果。
由于⼆进制数据是按照8⽐特⼀组进⾏传输,因此Base64按照6⽐特⼀组切分的⼆进制数据必须是24⽐特的倍数(6和8的最⼩公倍数)。
24⽐特就是3个字节,若原字节序列数据长度不是3的倍数时且剩下1个输⼊数据,则在编码结果后加2个=;若剩下2个输⼊数据,则在编码结果后加1个=。
完整的Base64定义可见RFC1421和RFC2045。
因为Base64算法是将3个字节原数据编码为4个字节新数据,所以Base64编码后的数据⽐原始数据略长,为原来的4/3。
(2)简单编码流程下⾯举例对字符串“ABCD”进⾏base64编码:对于不⾜6位的补零(图中浅红⾊的4位),索引为“A”;对于最后不⾜3字节,进⾏补零处理(图中红⾊部分),以“=”替代,因此,“ABCD”的base64编码为:“QUJDRA==”。
base64解码原理(1)base64解码过程base64解码,即是base64编码的逆过程,如果理解了编码过程,解码过程也就容易理解。
将base64编码数据根据编码表分别索引到编码值,然后每4个编码值⼀组组成⼀个24位的数据流,解码为3个字符。
对于末尾位“=”的base64数据,最终取得的4字节数据,需要去掉“=”再进⾏转换。
解码过程可以参考上图,逆向理解:“QUJDRA==” ——>“ABCD”1)将所有字符转化为ASCII 码;2)将ASCII 码转化为8位⼆进制;3)将8位⼆进制3个归成⼀组(不⾜3个在后边补0)共24位,再拆分成4组,每组6位;4)将每组6位的⼆进制转为⼗进制;5)从Base64编码表获取⼗进制对应的Base64编码;(2)base64解码特点base64编码中只包含64个可打印字符,⽽PHP在解码base64时,遇到不在其中的字符时,将会跳过这些字符,仅将合法字符组成⼀个新的字符串进⾏解码。
OpenSSL常用函数(Base64编码及解码)
Base64编码就是把⼆进制数据转换为可见的ASCII字符。
Base64解码是相反的过程。
主要函数 1、 Base64编码初始化函数 Void EVP_EncodeInit(EVP_ENCODE_CTX *ctx); 参数ctx:[IN]⽤于保存Base64编码的的状态。
2、 Base64编码Update函数。
Void EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *out1, const unsigned char *in, int in1); 功能:进⾏Base64数据编码,对于⼤数据可以重复调⽤。
3、 Base64编码结束函数 Void EVP_EncodeFinal(EVP_ENCODE_CTX *ctx, unsigned char *out, int *out1); 函数功能:编码结束,输出最后剩余的编码数据。
4、 Base64编码函数 Void EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int n); 功能:进⾏Base64数据编码,适⽤于⼩量数据。
参数:t:[OUT]编码后的数据。
F:[IN]待编码的数据。
N:[IN]待编码数据的长度 返回值:编码后的数据长度。
5、 Base64解码初始化函数 Void EVP_DecodeInit(EVP_ENCODE_CTX *ctx); 参数ctx:[IN]⽤于保存Base64解码的的状态。
6、 Base64解码Update函数 Void EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx, unsigned char *out, int *out1, const unsigned char *in, int in1); 功能:进⾏Base64数据解码,考试⼤提⽰对于⼤数据可以重复调⽤。
Base64算法原理,以及编码、解码【加密、解密】介绍
Base64算法原理,以及编码、解码【加密、解密】介绍Base64编码,是我们程序开发中经常使⽤到的编码⽅法。
它是⼀种基于⽤64个可打印字符来表⽰⼆进制数据的表⽰⽅法。
它通常⽤作存储、传输⼀些⼆进制数据编码⽅法!也是MIME(多⽤途互联⽹邮件扩展,主要⽤作电⼦邮件标准)中⼀种可打印字符表⽰⼆进制数据的常见编码⽅法!它其实只是定义⽤可打印字符传输内容⼀种⽅法,并不会产⽣新的字符集!有时候,我们学习转换的思路后,我们其实也可以结合⾃⼰的实际需要,构造⼀些⾃⼰接⼝定义编码⽅式。
好了,我们⼀起看看,它的转换思路吧!Base64实现转换原理它是⽤64个可打印字符表⽰⼆进制所有数据⽅法。
由于2的6次⽅等于64,所以可以⽤每6个位元为⼀个单元,对应某个可打印字符。
我们知道三个字节有24个位元,就可以刚好对应于4个Base64单元,即3个字节需要⽤4个Base64的可打印字符来表⽰。
在Base64中的可打印字符包括字母A-Z、a-z、数字0-9 ,这样共有62个字符,此外两个可打印符号在不同的系统中⼀般有所不同。
但是,我们经常所说的Base64另外2个字符是:“+/”。
这64个字符,所对应表如下。
转换的时候,将三个byte的数据,先后放⼊⼀个24bit的缓冲区中,先来的byte占⾼位。
数据不⾜3byte的话,于缓冲区中剩下的bit⽤0补⾜。
然后,每次取出6个bit,按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作为编码后的输出。
不断进⾏,直到全部输⼊数据转换完成。
如果最后剩下两个输⼊数据,在编码结果后加1个“=”;如果最后剩下⼀个输⼊数据,编码结果后加2个“=”;如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。
编码后的数据⽐原始数据略长,为原来的4/3。
⽆论什么样的字符都会全部被编码,因此不像编码,还保留部分可打印字符。
VB使用Base64编码
VB使用Base64编码作者:陈新龙来源:《电脑报》2021年第47期现有的字符集非常多,常用的有ASCII、UTF-8、GBK等。
ASCII编码是美国信息交换标准代码的简称,它是现今最通用的单字节编码系统,只定义了128个字符。
其他的编码内容更丰富,容量也更大。
在各种信息传输渠道中并不能很好地支持所有的编码,比如在邮件传输中就不支持ASCII 编码中的控制字符。
连最通用的ASCII编码都不能完全支持,其他编码我们就更无法保证信息传输的完整性了。
为了保证各种信息传输渠道都能正确识别信息,Base64编码诞生了。
Base64是一种用64个字符来表示任意二进制数据的方法,将二进制数据转变为64个“可打印字符”。
它是一种编码方式,而非加密方式。
Base64一般用于在HTTP协议下传输二进制数据,由于HTTP协议是文本协议,所以在HTTP协议下传输二进制数据前需要将二进制数据转换为字符数据。
然而简单的直接转换是不够的,因为网络传输只能传输可打印字符。
这64个字符中包括大小写字母、数字、+和/,还有用来补缺的特殊字符=(图1)。
以在VB中將ASCII编码进行Base64编码和解码为例。
Base64有64个字符,2^6=64。
所以用一个6位的二进制数来表示一个Base64编码表就够了。
如果有3个字节(3×8=24)共计24位的二进制数,就刚好可以用4位(4×6=24)Base64字符来表示。
ASCII编码转Base64编码流程的第一步是将ASCII编码字符串根据ASCII码对照表转换成二进制数,然后把二进制数值按每6位进行划分,然后将6位二进制数转换为十进制数,然后在对照表中找到Base64编码字符完成转码。
如果待编码字符串长度不是3的倍数怎么办呢?不是3的倍数会导致ASCII转换的二进制数串不能整除于6了,也就不能完整编码为Base64。
为了让编译出的数串可以整除,就需要用0补位。
如果有连续六位都是0的话,就用字符“=”来表示。
编码解码Base64
Base64算法:主要用于邮件,加密后的密文只包括大小写字母,10个数字和+ / = ,共计65个,其中==只作为占位符,在密文最后出现,所以只有64个字符,而1byete=8bit,1byte能表示256,而为了只能表示64,所以只取1byte只取6bit,然后在前面补2bit的0,即可。
这样如果原来三个字节的明文,编码后,变成4byte密文,也就是变长了1/3.如果明文字符数不是3的整数倍,则最后肯定还剩有字符,则后面也要补足0,结果生成了==例如A:0x41 二进制0100 0001 前6位010000 补高位两个0为0001 0000 即十进制的16对应Q。
剩下的二位01,所以后面需要补足2byte,这样才能有18位,可以被6整除。
01 0000 0000 0000 0000进行编码:0001 0000 编码为Q,后面为两个占位符,用==填充。
例子:Jav编码后为SmF2J:0x4A 二进制表示:0100 1010a:ox61 0110 0001v:0x76 0111 0110010010 补位为0001 0010 为十进制18 S100110 补位为0010 0110 为十进制38 m000101 补位为0000 0101 为十进制 5 F110110 补位为0011 0110 为十进制54 2经过查表后为SmF2Base64的字符映射表数值(十进制)编码数值编码数值编码1B18S35j5202C19T36k5313D20U37l5424E21V38m5535F22W39n5646G23X40o5757H24Y41p5868I25Z42q5979J26a43r60810K27b44s61911L28c45t62+12M29d46u63/13N30e47v占位=14O31f48w15P32g49xURL Base64,因为主要是替换62 和63字符,将+和/变成了-和_,而对于占位符,Bouncy Castle 将之用.代替,而Commons Codes杜绝任何的补位符。
base编码解码算法
Base64是一种对字符通过二进制进行编码解码转换的一种编码算法,便于在不同环境间通信,规避了乱码的出现。
具体来说,Base64编码算法将每3个字节24位的数据转化为4个字节32位的数据,从而获得76%的压缩率。
在Python中,可以使用标准库中的base64模块进行Base64的编码和解码。
以下是一个简单的示例:
python
import base64
# 编码
data = b'hello world'
encoded_data = base64.b64encode(data)
print(encoded_data) # 输出:b'aGVsbG8gd29ybGQh'
# 解码
decoded_data = base64.b64decode(encoded_data)
print(decoded_data) # 输出:b'hello world'
在这个例子中,我们首先导入了base64模块,然后定义了一个字符串data,它包含了一些二进制数据。
接着,我们使用base64.b64encode函数对数据进行编码,得到一个字节串encoded_data。
最后,我们使用base64.b64decode函数对字节串进行解码,得到原始的二进制数据。
vb encode编码
vb encode编码在VB(Visual Basic)中,可以使用不同的编码方式对字符串进行编码和解码操作。
下面是几种常见的编码方式及其在VB中的示例代码:1.UTF-8 编码:Dim str As String = "要编码的字符串"Dim utf8Bytes As Byte() = System.Text.Encoding.UTF8.GetBytes(str) Dim encodedStr As String = System.Text.Encoding.UTF8.GetString(utf8Bytes)2.UTF-16 编码:Dim str As String = "要编码的字符串"Dim utf16Bytes As Byte() = System.Text.Encoding.Unicode.GetBytes(str)Dim encodedStr As String = System.Text.Encoding.Unicode.GetString(utf16Bytes)3.ASCII 编码:Dim str As String = "要编码的字符串"Dim asciiBytes As Byte() = System.Text.Encoding.ASCII.GetBytes(str) Dim encodedStr As String = System.Text.Encoding.ASCII.GetString(asciiBytes)4.Base64 编码:Dim str As String = "要编码的字符串"Dim bytes As Byte() = System.Text.Encoding.UTF8.GetBytes(str)Dim base64Str As String = Convert.ToBase64String(bytes)Dim decodedStr As String = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(base64St r))以上示例代码演示了如何使用不同的编码方式对字符串进行编码和解码操作。
Base64加密解密原理以及代码实现
Base64加密解密原理以及代码实现1. Base64使⽤A--Z,a--z,0--9,+,/ 这64个字符.2. 编码原理:将3个字节转换成4个字节( (3 X 8) = 24 = (4 X 6) )先读⼊3个字节,每读⼀个字节,左移8位,再右移四次,每次6位,这样就有4个字节了.3. 解码原理:将4个字节转换成3个字节.先读⼊4个6位(⽤或运算),每次左移6位,再右移3次,每次8位.这样就还原了.Base64是⼀种⾮经常见的编码规范,其作⽤是将⼆进制序列转换为⼈类可读的ASCII字符序列,经常使⽤在需⽤通过⽂本协议(⽐⽅HTTP和SMTP)来传输⼆进制数据的情况下。
Base64并⾮⼀种⽤于安全领域的加密解密算法(这类算法有DES等),虽然我们有时也听到使⽤Base64来加密解密的说法,但这⾥所说的加密与解密实际是指编码(encode)和解码(decode)的过程,其变换是⾮常easy的,只可以避免信息被直接识别。
Base64採⽤了⼀种⾮常easy的编码转换:对于待编码数据,以3个字节为单位,依次取6位数据并在前⾯补上两个0形成新的8位编码,因为3*8=4*6,这样3个字节的输⼊会变成4个字节的输出,长度上添加�了1/3。
上⾯的处理还不能保证得到的字符都是可见字符,为了达到此⽬的,Base64制定了⼀个编码表,进⾏统⼀的转换。
码表的⼤⼩为2^6=64,这也是Base64名称的由来。
Base64编码表Value Encoding Value Encoding Value Encoding Value Encoding0 A 17 R 34 i 51 z1 B 18 S 35 j 52 02 C 19 T 36 k 53 13 D 20 U 37 l 54 24 E 21 V 38 m 55 35 F 22 W 39 n 56 46 G 23 X 40 o 57 57 H 24 Y 41 p 58 68 I 25 Z 42 q 59 79 J 26 a 43 r 60 810 K 27 b 44 s 61 911 L 28 c 45 t 62 +12 M 29 d 46 u 63 /13 N 30 e 47 v14 O 31 f 48 w (pad) =15 P 32 g 49 x16 Q 33 h 50 yBase64编解码算法都⾮常easy,⽹上有⾮常多源代码,这⾥就不介绍了。
【VBA研究】如何用Base64编解码方法实现简单的加解密
【VBA研究】如何⽤Base64编解码⽅法实现简单的加解密Base64编码的思想是是采⽤64个基本的ASCII码字符对数据进⾏重新编码,将数据变成字符串实现⽂本传输。
由于编码简单,所以很容易实现,代码也是现成的。
利⽤这个编码规则可以实现简单的加解密。
编解码⽅法见: VB实现Base64 编解码我⽤VBA做了个简单的系统,其中⽤到⽤户登录,⾃然要保存⽤户名和密码。
密码存放在数据库中,不想明码保存,于是就想到⽤这个编码⽅法进⾏加密。
Base64编码是按照64个字符字典进⾏编码的,为了加密,这64个字符可以打乱原来的顺序,也可以⽤其他字符替换掉部分字符,如果不考虑解码,这个字符字典中的字符甚⾄可以重复。
⽐如密码保存,只需⽐较密⽂,不需要还原成明⽂进⾏⽐较,那么字符字典中重复也是没有问题的,可以任意取64个字符作为字典。
下⾯这个函数就可以⽤来⽣成密码的密⽂,其中的数据字典是⽤个随机函数随意⽣成的:Function B64Encode(sou_str As String) As String 'Base64 编码On Error GoTo over '排错Dim buf() As Byte, length As Long, mods As LongDim Str() As Byte, kk As Long, i As Long'字符字典(⽤随机产⽣的)Const B64_CHAR_DICT = "Qx7mCcL2XsYm!Q^ZjKeLn#r2H4rV6B(Xu$v$zU2@CnHfVf7tH9XrBcB9WyA6F%Ah."kk = Len(sou_str) - 1ReDim Str(kk)For i = 0 To kkStr(i) = Asc(Mid(sou_str, i + 1, 1))Next imods = (UBound(Str) + 1) Mod 3 '除以3的余数length = UBound(Str) + 1 - modsReDim buf(length / 3 * 4 + IIf(mods <> 0, 4, 0) - 1)For i = 0 To length - 1 Step 3buf(i / 3 * 4) = (Str(i) And &HFC) / &H4buf(i / 3 * 4 + 1) = (Str(i) And &H3) * &H10 + (Str(i + 1) And &HF0) / &H10buf(i / 3 * 4 + 2) = (Str(i + 1) And &HF) * &H4 + (Str(i + 2) And &HC0) / &H40buf(i / 3 * 4 + 3) = Str(i + 2) And &H3FNextIf mods = 1 Thenbuf(length / 3 * 4) = (Str(length) And &HFC) / &H4buf(length / 3 * 4 + 1) = (Str(length) And &H3) * &H10buf(length / 3 * 4 + 2) = 64buf(length / 3 * 4 + 3) = 64ElseIf mods = 2 Thenbuf(length / 3 * 4) = (Str(length) And &HFC) / &H4buf(length / 3 * 4 + 1) = (Str(length) And &H3) * &H10 + (Str(length + 1) And &HF0) / &H10buf(length / 3 * 4 + 2) = (Str(length + 1) And &HF) * &H4buf(length / 3 * 4 + 3) = 64End IfFor i = 0 To UBound(buf)B64Encode = B64Encode + Mid(B64_CHAR_DICT, buf(i) + 1, 1)Nextover:End Function'调⽤测试Private Sub ttt()aa = B64Encode("iamlaosong")bb = B64Encode("iamlaosong")MsgBox aa & " " & bbEnd Sub关于随机字符串的产⽣,见:【VBA研究】⽣成随机密码---------------------。
BASE64编码与解码
C#实现Base64编码与解码Posted on 2008-01-17 16:43 小y阅读(2085) 评论(3)编辑收藏所属分类: [09] 串口通信&网络编程一、编码规则Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。
它将需要编码的数据拆分成字节数组。
以3个字节为一组。
按顺序排列24 位数据,再把这24位数据分成4组,即每组6位。
再在每组的的最高位前补两个0凑足一个字节。
这样就把一个3字节为一组的数据重新编码成了4个字节。
当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节。
这时在最后一组填充1到2个0字节。
并在最后编码完成后在结尾添加1到2个“=”。
例:将对ABC进行BASE64编码:1、首先取ABC对应的ASCII码值。
A(65)B(66)C(67);2、再取二进制值A(01000001)B(01000010)C(01000011);3、然后把这三个字节的二进制码接起来(010000010100001001000011);4、再以6位为单位分成4个数据块,并在最高位填充两个0后形成4个字节的编码后的值,(00010000)(00010100)(00001001)(00000011),其中蓝色部分为真实数据;5、再把这四个字节数据转化成10进制数得(16)(20)(9)(3);6、最后根据BASE64给出的64个基本字符表,查出对应的ASCII码字符(Q)(U)(J)(D),这里的值实际就是数据在字符表中的索引。
注:BASE64字符表:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/二、解码规则解码过程就是把4个字节再还原成3个字节再根据不同的数据形式把字节数组重新整理成数据。
三、C#中的实现编码类:///<summary>/// Base64编码类。
base64的编解码方法【最新】
Base64是一种很常用的编码方式,利用它可以将任何二进制的字符编码到可打印的64个字符之中,这样,不管是图片,中文文本等都可以编码成只有ASCII的纯文本。
至于为什么要进行这个转换呢,最初主要使用在EMail领域,早期的一些邮件网关只识别ASCII,如果发现邮件里有其他字符,就会将它们过滤掉,这样中文的邮件,有图片附件的邮件在这些网关上就会发生问题,于是将中文和图片都使用base64编码然后传输,接受后再解码就客服了这个问题了。
Base64除了可以使用在相似场合,还可以用作简单的加密等等。
下面介绍下Base64的方法:首先是Base64中可能出现的所有字符:0 A 17 R 34 i 51 z1 B 18 S 35 j 52 02 C 19 T 36 k 53 13 D 20 U 37 l 54 24 E 21 V 38 m 55 35 F 22 W 39 n 56 46 G 23 X 40 o 57 57 H 24 Y 41 p 58 68 I 25 Z 42 q 59 79 J 26 a 43 r 60 810 K 27 b 44 s 61 911 L 28 c 45 t 62 +12 M 29 d 46 u 63 /13 N 30 e 47 v14 O 31 f 48 w (pad) =15 P 32 g 49 x16 Q 33 h 50 y所有的字符就是'A'~'Z','a'~'z','0'~'9','+','/'共64个,以及末尾的填充字符'='编码的方法是:从输入缓冲中依次取出字符,第一个字符的,从最高位开始取出6个bit,这6个bit的值的范围在0~63,将这个值作为索引,对应上面的表格,找到相应的字符,这便是第一个Base64后的字符,然后将第一个字符的低2位与第二个字符的高4位组成6个bit, 同样查表得到第二个Base64字符,以此类推,从左向右没凑足6个bit就转换成一个Base64字符,由于输入缓冲中每3个字符包含24个bit,这24个bit正好可以转成4个Base64字符,所以没3个字符能组成一个转换循环,如果输入缓冲中字符的个数是3 的整数倍,那么结果就是4的整数倍,两者的长度是3:4的关系,但是如果输入字符不是3的整数倍呢?这就涉及到了末尾填充问题。
Base64编码与解码详解
Base64编码与解码详解Base64 是基于 64 个可打印字符 A-Z、a-z、0-9、+、/ 来表⽰⼆进制数据的表⽰⽅法,常⽤于数据在⽹络中的传输。
本篇将分别介绍其编码、解码以及实际运⽤。
Base64 编码Base64 本质是⼀种将⼆进制转为⽂本的⽅案。
基本规则如下:编码时候选⽤ 64 (⼤⼩写英⽂字母,数字,+ /)个字符以及⽤作补位的=来表⽰在编码的时候,将3个字节变为4个字节,4个字节的⾼两位都⽤ 00 来填充,后 6 位来表⽰ 64 个字符。
以⼀个实际的例⼦ "YOU" 为例,其编码过程如下:由上表格可知 "YOU"对应的 Base64 编码为:"WU9V"。
对于要待编码的字符数如果不是 3 的倍数时候,会⽤ 0 去填充,编码出来后⽤ = 号表⽰,如: "ME" 其编码如下:Base64 解码将 4 个字节变为 3 个字节;将 24 bit 左移 16 位,与 255 进⾏与操作,获得第⼀个字符,将 24 bit 左移 8 位,与 255 进⾏与操作,获得第⼆个字符,将 24 bit 与 255 进⾏与操作,获取第三个字符Base64 实现与运⽤场景在 Node 中提供 Buffer 模块,可以进⾏⼆进制或者字符与 Base64 的想换转换,其代码如下:const buf2 = Buffer.alloc(2);buf2.write("M", 0);buf2.write("E", 1);buf2.toString("base64"); //TUU=// base64 解码const decodeBase64 = new Buffer("TUU=", "base64").toString(); //MEBase64 有着⼴泛的使⽤,如:对不⽀持⼆进制传输的场景,将⼆进制数据编码成 Base64 传输给服务器Base64 编码图⽚MIME, 电⼦邮件系统中使⽤ Base64 编码后传输。
Base64编码与解码
Base64编码与解码关于base64编码Encode和Decode编码的⼏种⽅式Base64是⼀种能将任意Binary资料⽤64种字元组合成字串的⽅法,⽽这个Binary资料和字串资料彼此之间是可以互相转换的,⼗分⽅便。
在实际应⽤上,Base64除了能将Binary资料可视化之外,也常⽤来表⽰字串加密过后的内容。
如果要使⽤Java 程式语⾔来实作Base64的编码与解码功能,可以参考本篇⽂章的作法。
早期作法早期在Java上做Base64的编码与解码,会使⽤到JDK⾥sun.misc套件下的BASE64Encoder和BASE64Decoder这两个类别,⽤法如下:import sun.misc.BASE64Decoder;BASE64Encoder encoder = new BASE64Encoder();BASE64Decoder decoder = new BASE64Decoder();String text = "字串⽂字";byte[] textByte = text.getBytes("UTF-8");//编码String encodedText = encoder.encode(textByte);System.out.println(encodedText);//解码System.out.println(new String(decoder.decodeBuffer(encodedText), "UTF-8"));BASE64Encoder encoder = new BASE64Encoder();BASE64Decoder decoder = new BASE64Decoder();String text = "字串⽂字";byte[] textByte = text.getBytes("UTF-8");//编码String encodedText = encoder.encode(textByte);System.out.println(encodedText);//解码System.out.println(new String(decoder.decodeBuffer(encodedText), "UTF-8"));从以上程式可以发现,在Java⽤Base64⼀点都不难,不⽤⼏⾏程式码就解决了!只是这个sun.mis c套件所提供的Base64功能,编码和解码的效率并不太好,⽽且在以后的Java版本可能就不被⽀援了,完全不建议使⽤。
BASE64编解码
BASE64编解码BASE64编码是一种常用的将十六进制数据转换为可见字符的编码。
与ASCII码相比,它占用的空间较小。
BASE64编码在rfc3548中定义。
1、base64编解码原理将数据编码成BASE64编码时,以3字节数据为一组,转换为24bit的二进制数,将24bit的二进制数分成四组,每组6bit。
对于每一组,得到一个数字:0-63。
然后根据这个数字查表即得到结果。
表如下:Value Encoding Value Encoding Value Encoding Value Encoding0 A 17 R 34 i 51 z1 B 18 S 35 j 52 02 C 19 T 36 k 53 13 D 20 U 37 l 54 24 E 21 V 38 m 55 35 F 22 W 39 n 56 46 G 23 X 40 o 57 57 H 24 Y 41 p 58 68 I 25 Z 42 q 59 79 J 26 a 43 r 60 810 K 27 b 44 s 61 911 L 28 c 45 t 62 +12 M 29 d 46 u 63 /13 N 30 e 47 v14 O 31 f 48 w (pad) =15 P 32 g 49 x16 Q 33 h 50 y比如有数据:0x30 0x82 0x02编码过程如下:1)得到16进制数据: 30 82 022)得到二进制数据: 00110000 10000010 000000103)每6bit分组: 001100 001000 001000 0000104)得到数字: 12 8 8 25)根据查表得到结果: M I I CBASE64填充:在不够的情况下在右边加0。
有三种情况:1) 输入数据比特数是24的整数倍(输入字节为3字节整数倍),则无填充;2) 输入数据最后编码的是1个字节(输入数据字节数除3余1),即8比特,则需要填充2个"==",因为要补齐6比特,需要加2个00;3)输入数据最后编码是2个字节(输入数据字节数除3余2),则需要填充1个"=",因为补齐6比特,需要加一个00。
Base64编解码
Base64编解码一、编码原理Base64是一种基于64个可打印字符来表示二进制数据的表示方法。
由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。
三个字节有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。
编码后的数据比原来的数据略长,是原来的4/3倍。
它可用来作为电子邮件的传输编码。
在Base64中的可打印字符包括字母A-Z、a-z、数字0-9 ,这样共有62个字符,此外两个可打印符号在不同的系统中而不同(Base64de 编码表如下所示)。
Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。
包括MIME的email,email via MIME, 在XML中存储复杂数据.Base64编码表二、编码流程步骤1:将要编码的所有字符都转化成对应的ASCII码。
步骤2:将所有的ASCII码转换成对应的8位长的二进制数。
步骤3:将所得的二进制数从高位到低位开始分成6位一组,最后一组不足六的则补充0步骤4:将每组二进制数转换成十进制数,然后对照base64的编码表查找得到相应的编码。
注意:1、要求被编码字符是8bit的,所以须在ASCII编码范围内,\u0000-\u00ff,中文就不行。
2、如果被编码的字符串中字符的个数为3的倍数,按照上面的步骤即可得到正确的base64编码。
但是如果不是3的倍数则要分情况讨论。
如果是3的倍数余1,则要在编好的码字后面加上两个“=”,如果是3的倍数余2,这要在编好的码字后面加上一个“=”。
(例如w的base64编码为dw==,w1的base64编码为dzE=)下面我们来对具体的字符串进行编码举例,以便更好的理解编码流程:编码「Man」在此例中,Base64算法将三个字符编码为4个字符特殊情况A的编码为QQ= =BC的编码为QkM=三、核心算法程序算法的基本原理如下:由于每次转换都需要6个bit,而这6个bit可能都来自一个字节,也可以来自前后相临的两个字节。
javascript中的Base64.UTF8编码与解码详解
javascript中的Base64.UTF8编码与解码详解javascript中的Base64.UTF8编码与解码详解本⽂给⼤家介绍的是javascript中的Base64、UTF8编码与解码的函数源码分享以及使⽤范例,⼗分实⽤,推荐给⼩伙伴们,希望⼤家能够喜欢。
Base64编码说明 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前⾯补两个0,形成8位⼀个字节的形式。
如果剩下的字符不⾜3个字节,则⽤0填充,输出字符使⽤'=',因此编码后输出的⽂本末尾可能会出现1或2个'='。
base64编码库:(已验证可⽤)var base64 = (function(){var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";return {"encode64":encode64,"decode64":decode64}function encode64(input){input = strUnicode2Ansi(input);var output = "";var chr1, chr2, chr3 = "";var enc1, enc2, enc3, enc4 = "";var i = 0;do{chr1 = input.charCodeAt(i++);chr2 = input.charCodeAt(i++);chr3 = input.charCodeAt(i++);enc1 = chr1 >> 2;enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);enc4 = chr3 & 63;if (isNaN(chr2)){enc3 = enc4 = 64;}else if(isNaN(chr3)){enc4 = 64;}output = output +keyStr.charAt(enc1) +keyStr.charAt(enc2) +keyStr.charAt(enc3) +keyStr.charAt(enc4);chr1 = chr2 = chr3 = "";enc1 = enc2 = enc3 = enc4 = "";}while(i < input.length);return output;}function decode64(input){var output = "";var chr1, chr2, chr3 = "";var enc1, enc2, enc3, enc4 = "";var i = 0;if(input.length%4!=0){return "";}var base64test = /[^A-Za-z0-9\+\/\=]/g;if (base64test.exec(input)){return "";}do {enc1 = keyStr.indexOf(input.charAt(i++));enc2 = keyStr.indexOf(input.charAt(i++));enc3 = keyStr.indexOf(input.charAt(i++));enc4 = keyStr.indexOf(input.charAt(i++));chr1 = (enc1 << 2) | (enc2 >> 4);chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);chr3 = ((enc3 & 3) << 6) | enc4;output = output + String.fromCharCode(chr1);if (enc3 != 64) {output+=String.fromCharCode(chr2);}if (enc4 != 64) {output+=String.fromCharCode(chr3);}chr1 = chr2 = chr3 = "";enc1 = enc2 = enc3 = enc4 = "";} while (i < input.length);return strAnsi2Unicode(output);}function UnicodeChr(){return '00A4,00A7,00A8,00B0,00B1,00B7,00D7,00E0,00E1,00E8,00E9,00EA,00EC,00ED,00F2,00F3,00F7,00F9,00FA,00FC,0101,0113,011B,012B,014D,016B,01CE,01D0,01D2,01D4,01D6,01D8,01DA,01DC,02C7,02C9,0391,0392,0393,039 }function AnsicodeChr(){return 'A1E8,A1EC,A1A7,A1E3,A1C0,A1A4,A1C1,A8A4,A8A2,A8A8,A8A6,A8BA,A8AC,A8AA,A8B0,A8AE,A1C2,A8B4,A8B2,A8B9,A8A1,A8A5,A8A7,A8A9,A8AD,A8B1,A8A3,A8AB,A8AF,A8B3,A8B5,A8B6,A8B7,A8B8,A1A6,A1A5,A6A1 }function UnicodeToAnsi(chrCode){var chrHex=chrCode.toString(16);chrHex="000"+chrHex.toUpperCase();chrHex=chrHex.substr(chrHex.length-4);var i=UnicodeChr().indexOf(chrHex);if(i!=-1){chrHex=AnsicodeChr().substr(i,4);}return parseInt(chrHex,16)}function AnsiToUnicode(chrCode){var chrHex=chrCode.toString(16);chrHex="000"+chrHex.toUpperCase();chrHex=chrHex.substr(chrHex.length-4);var i=AnsicodeChr().indexOf(chrHex);if(i!=-1){chrHex=UnicodeChr().substr(i,4);}return parseInt(chrHex,16)}function strUnicode2Ansi(asContents){var len1=asContents.length;var temp="";for(var i=0;i<len1;i++){var varasc=asContents.charCodeAt(i);if(varasc<0)varasc+=65536;if(varasc>127)varasc=UnicodeToAnsi(varasc);if(varasc>255){var varlow=varasc & 65280;varlow=varlow>>8;var varhigh=varasc & 255;temp+=String.fromCharCode(varlow)+String.fromCharCode(varhigh);}else{temp+=String.fromCharCode(varasc);}}return temp;}function strAnsi2Unicode(asContents){var len1=asContents.length;var temp="";var chrcode;for(var i=0;i<len1;i++){var varasc=asContents.charCodeAt(i);if(varasc>127){chrcode=AnsiToUnicode((varasc<<8)+asContents.charCodeAt(++i));}else{chrcode=varasc;}temp+=String.fromCharCode(chrcode);}return temp;}}());测试:var str = base64.encode64("这是测试");alert(base64.decode64(str));1.Base64编码与解码:(未验证)代码如下:var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var base64DecodeChars = new Array(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, /*** base64编码* @param {Object} str*/function base64encode(str){var out, i, len;var c1, c2, c3;len = str.length;i = 0;out = "";while (i < len) {c1 = str.charCodeAt(i++) & 0xff;if (i == len) {out += base64EncodeChars.charAt(c1 >> 2);out += base64EncodeChars.charAt((c1 & 0x3) << 4);out += "==";break;}c2 = str.charCodeAt(i++);if (i == len) {out += base64EncodeChars.charAt(c1 >> 2);out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4)); out += base64EncodeChars.charAt((c2 & 0xF) << 2);out += "=";break;}c3 = str.charCodeAt(i++);out += base64EncodeChars.charAt(c1 >> 2);out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4)); out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6)); out += base64EncodeChars.charAt(c3 & 0x3F);}return out;}/*** base64解码* @param {Object} str*/function base64decode(str){var c1, c2, c3, c4;var i, len, out;len = str.length;i = 0;out = "";while (i < len) {/* c1 */do {c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];}while (i < len && c1 == -1);if (c1 == -1)break;/* c2 */do {c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];}while (i < len && c2 == -1);if (c2 == -1)break;out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));/* c3 */do {c3 = str.charCodeAt(i++) & 0xff;if (c3 == 61)return out;c3 = base64DecodeChars[c3];}while (i < len && c3 == -1);if (c3 == -1)break;out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));/* c4 */do {c4 = str.charCodeAt(i++) & 0xff;if (c4 == 61)return out;c4 = base64DecodeChars[c4];}while (i < len && c4 == -1);if (c4 == -1)break;out += String.fromCharCode(((c3 & 0x03) << 6) | c4);}return out;}/*** utf16转utf8* @param {Object} str*/function utf16to8(str){var out, i, len, c;out = "";len = str.length;for (i = 0; i < len; i++) {c = str.charCodeAt(i);if ((c >= 0x0001) && (c <= 0x007F)) {out += str.charAt(i);}elseif (c > 0x07FF) {out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));}else {out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));}}return out;}/*** utf8转utf16* @param {Object} str*/function utf8to16(str){var out, i, len, c;var char2, char3;out = "";len = str.length;i = 0;while (i < len) {c = str.charCodeAt(i++);switch (c >> 4) {case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:// 0xxxxxxxout += str.charAt(i - 1);break;case 12:case 13:// 110x xxxx 10xx xxxxchar2 = str.charCodeAt(i++);out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));break;case 14:// 1110 xxxx10xx xxxx10xx xxxxchar2 = str.charCodeAt(i++);char3 = str.charCodeAt(i++);out += String.fromCharCode(((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0));break;}}return out;}//demo//function doit(){// var f = document.f;// f.output.value = base64encode(utf16to8(f.source.value));// f.decode.value = utf8to16(base64decode(f.output.value));//}2.UTF8编码与解码:代码如下:function encodeUTF8(str){var temp = "",rs = "";for( var i=0 , len = str.length; i < len; i++ ){temp = str.charCodeAt(i).toString(16);rs += ""+ new Array(5-temp.length).join("0") + temp;}return rs;}function decodeUTF8(str){return str.replace(/(, function($0,$1,$2){return String.fromCharCode(parseInt($2,16));});}以上就是本⽂的全部内容了,希望能够对⼤家熟练掌握javascript中的base64编码解码有所帮助。