基于VBS、ASP环境下的BASE64 Encode 和 Decode

本文介绍了在VBS和ASP环境下,由于特定API需求,作者自编的Base64编码和解码实现。提供的源码经过初步测试,适用于满足特定编码格式要求的场景。

网络上有各种Base64编码、解码的例子源码,编码后虽然也可以通过大部分解码程序解码,但编码后的结果却各有不同。

转载请说明来源于:http://blog.csdn.net/aminfo/article/details/70478053

由于工作需要,在调用某API时,网络上的Base64编码结果不符合要求,于是自写一个基于VBS的BASE64 Encode和Decode,已经过初次测试。代码如下供参考:

<%'基于VBS、ASP的Base64 Encode 和 Base64 Decode
Dim sc
Set sc = CreateObject("MSScriptControl.ScriptControl")
sc.Language = "JScript"

Dim tmpStr, tmpResult
tmpStr = "··ASCII第···一次以规范标准的型态发表是在1967年,1234567890-=`~!·#¥%……—*()——+~!@#$%^&*()_+[]{};'\:""|,./<>?《》?:“|{},。/;‘、][ABCDEFGHIJKLMNOPQRSTUVWXYZ最后一次更新则是在1986年,至今为止共定义了128个字符,其中33个字符无法显示(这是以现今操作系统为依归,但在DOS模式··"
tmpResult = vbsBase64Encode(StringToByteArray(tmpStr))
Response.write "编码: " & tmpResult & "<BR>"
tmpResult = ByteArrayToString(vbsBase64Decode(tmpResult))
Response.write "解码:" & tmpResult & "<BR>"
Response.write "原串:" & tmpStr & "<BR>"

If tmpStr <> tmpResult Then
	Response.write "结果不同"
Else
	Response.write "结果相同"
End If

'编码
Function vbsBase64Encode(byteArray)
	Dim last2byte : last2byte = 3
	Dim last4byte : last4byte = 15
	Dim last6byte : last6byte = 63
	Dim lead6byte : lead6byte = 252
	Dim lead4byte : lead4byte = 240
	Dim lead2byte : lead2byte = 192
	Dim encodeTable : encodeTable = Split("A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9,+,/", ",")
	Dim objectStr : objectStr = ""
	Dim num
	num = 0
	Dim currentByte
	currentByte = 0
	Dim i
	For i = 0 to ubound(byteArray)
		num = num mod 8
		do while(num < 8)
			Select Case num
			 Case 0
			 	currentByte = byteArray(i) and lead6byte
				currentByte = uRShift(currentByte, 2)
			 Case 2
			 	currentByte = byteArray(i) and last6byte
			 Case 4
			 	currentByte = byteArray(i) and last4byte
			 	currentByte = LShift(currentByte, 2)
			 	If ((i + 1) <= ubound(byteArray)) Then
			 		currentByte = currentByte or uRShift(byteArray(i + 1) and lead2byte, 6)
				End If
			 Case 6
				currentByte = byteArray(i) and last2byte
				currentByte = LShift(currentByte, 4)
				If ((i + 1) <= ubound(byteArray)) Then
					currentByte = currentByte or uRShift(byteArray(i + 1) and lead4byte, 4)
				End If
			End Select
			objectStr = objectStr & encodeTable(currentByte)
			num = num + 6
		Loop
	Next
	If (Len(objectStr) mod 4 <> 0) Then
		For i = (4 - Len(objectStr) mod 4) to 1 step - 1
			objectStr = objectStr & "="
		Next
	End If
	vbsBase64Encode = objectStr
End Function
'转载请说明来源于:http://blog.csdn.net/aminfo/article/details/70478053
'解码
Function vbsBase64Decode(str)
	Dim delta
	Dim ALPHABET : ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
	If Right(str, 2) = "==" Then
		delta = 2
	ElseIf Right(str, 1) = "=" Then
		delta = 1
	Else
		delta = 0
	End If
	Redim buffer(Len(str) * 3 / 4 - delta)
	Dim mask : mask = &HFF
	Dim index : index =0
	Dim i, c0, c1, c2, c3
	For i = 1 to Len(str) step 4
		c0 = Instr(ALPHABET, mid(str, i, 1)) - 1
		c1 = Instr(ALPHABET, mid(str, i + 1, 1)) - 1
		buffer(index) = (LShift(c0, 2) or RShift(c1, 4)) and mask
		If buffer(index)>127 Then
			buffer(index) = buffer(index) - 256
		End If
		index = index + 1
		If(index >= ubound(buffer)) Then
			Exit For
		End If
		
		c2 = Instr(ALPHABET, mid(str, i + 2, 1)) - 1
		buffer(index) = (LShift(c1, 4) or RShift(c2, 2)) and mask
		If buffer(index)>127 Then
			buffer(index) = buffer(index) - 256
		End If
		index = index + 1
		If(index >= ubound(buffer)) Then
			Exit For
		End If
		
		c3 = Instr(ALPHABET, mid(str, i + 3, 1)) - 1
		buffer(index) = (LShift(c2, 6) or c3) and mask
		If buffer(index)>127 Then
			buffer(index) = buffer(index) - 256
		End If
		index = index + 1
	Next
	vbsBase64Decode = buffer
End Function
	
Function LShift(Value, Shift)
	LShift = sc.Eval(Value & "<<" & Shift)
End Function

Function RShift(Value, Shift)
	RShift = sc.Eval(Value & ">>" & Shift)
End Function

Function uLShift(Value, Shift)
	uLShift = sc.Eval(Value & "<<<" & Shift)
End Function

Function uRShift(Value, Shift)
	uRShift = sc.Eval(Value & ">>>" & Shift)
End Function
'转载请说明来源于:http://blog.csdn.net/aminfo/article/details/70478053
'------------------------------------------
Function ArrayAdd(byteArray1, byteArray2)
	Dim i, tmpStr
	tmpStr = ""
	For i = 0 to ubound(byteArray1)
		If i>0 Then
			tmpStr = tmpStr & ","
		End If
		tmpStr = tmpStr & byteArray1(i)
	Next
	For i = 0 to ubound(byteArray2)
		tmpStr = tmpStr & "," & byteArray2(i)
	Next
	ArrayAdd = Split(tmpStr, ",")
End Function

'Bin字符串转数组
Function BinToByteArray(szInput)
	Dim i, byteArray, wch, nAsc
	byteArray = ""
	For i=1 To Len(szInput)
		wch = Mid(szInput, i, 1)
		nAsc = AscW(wch)
		'Response.write "<BR>wch = " &  nAsc
		If nAsc>127 Then
			byteArray = byteArray & "," & (nAsc - 256)
		Else
			byteArray = byteArray & "," & nAsc
		End If
	Next
	If Left(byteArray, 1) = "," Then
		byteArray = Right(byteArray, Len(byteArray) - 1)
	End If
	BinToByteArray = Split(byteArray, ",")
End Function

'字符串转数组
Function StringToByteArray(szInput)
	Dim i, byteArray, wch, nAsc
	byteArray = ""
	For i=1 To Len(szInput)
		wch = Mid(szInput, i, 1)
		nAsc = AscW(wch)
		If nAsc < 0 Then
			nAsc = nAsc + 65536
		End If  
		If (nAsc And &HFF80) = 0 Then
			byteArray = byteArray & "," & AscW(wch)
		Else
			If (nAsc And &HF000) = 0 Then
				byteArray = byteArray & "," &  Cint("&H" & Hex(((nAsc \ 2 ^ 6)) Or &HC0)) - 256 & "," & Cint("&H" & Hex(nAsc And &H3F Or &H80))-256
			Else
				byteArray = byteArray & "," &  Cint("&H" & Hex((nAsc \ 2 ^ 12) Or &HE0)) - 256 & "," & Cint("&H" & Hex((nAsc \ 2 ^ 6) And &H3F Or &H80)) - 256 & "," & Cint("&H" & Hex(nAsc And &H3F Or &H80)) - 256
			End If
		End If
	Next
	If Left(byteArray, 1) = "," Then
		byteArray = Right(byteArray, Len(byteArray) - 1)
	End If
	StringToByteArray = Split(byteArray, ",")
End Function
'转载请说明来源于:http://blog.csdn.net/aminfo/article/details/70478053
'数组转字符串
Function ByteArrayToString(sArray)
	Dim i, tStr, byte1, byte2, byte3
	tStr = ""
	For i = 0 to ubound(sArray)
		If sArray(i)>0 and sArray(i)<128 Then
			tStr = tStr & Chr(sArray(i))
		Else
			If i < ubound(sArray) - 1 Then
				byte1 = ((sArray(i) + 256) And &H3F) * &H40
				If byte1<2048 Then
					byte1 = ((sArray(i) + 256) And &H3F) * &H40
					byte2 = (sArray(i + 1) + 256) And &H3F
					tStr = tStr & chrW(byte1 or byte2)
					i = i + 1
				Else
					byte1 = ((sArray(i) + 256) And &H0F) * &H1000
					byte2 = ((sArray(i + 1) + 256) And &H3F) * &H40
					byte3 = (sArray(i + 2) + 256) And &H3F
					tStr = tStr & chrW(byte1 or byte2 or byte3)
					i = i + 2				
				End If
			End If
		End If
	Next
	ByteArrayToString = tStr
End Function%>


### Base62 编码解码在 Java 中的实现 Base62 是一种常见的数据编码方式,类似于 Base64,但它使用 62 个字符(通常是 `0-9`、`A-Z` `a-z`)来表示数据。这种编码方式常用于需要将二进制数据转换为可打印文本格式的场景,例如生成短链接或唯一标识符。 #### Base62 编码原理 Base62 编码的核心思想是将任意字节流转换为一个由 62 个字符组成的字符串。具体步骤如下: 1. **分组**:将输入的字节按每 6 位进行分割,因为 $2^6 = 64$,而 Base62 使用 62 个字符,因此需要确保字符集与数值范围匹配。 2. **映射**:将每组 6 位的二进制值映射到 Base62 字符集中对应的字符。 3. **拼接**:将所有映射后的字符拼接成最终的编码结果。 #### Base62 解码原理 Base62 解码的过程与编码相反,主要包括以下步骤: 1. **拆分**:将编码后的字符串逐个字符拆分为单独的字符。 2. **反向映射**:将每个字符转换回其对应的 6 位二进制值。 3. **合并**:将所有的 6 位二进制值重新组合成原始的字节流。 #### Java 实现代码 以下是一个简单的 Java 实现,用于完成 Base62 的编码解码功能: ```java import java.util.HashMap; import java.util.Map; public class Base62 { private static final String BASE62_CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; private static final int BASE62 = 62; private static final Map<Character, Integer> CHAR_TO_INDEX_MAP = new HashMap<>(); static { for (int i = 0; i < BASE62_CHARS.length(); i++) { CHAR_TO_INDEX_MAP.put(BASE62_CHARS.charAt(i), i); } } // 编码方法 public static String encode(byte[] data) { StringBuilder sb = new StringBuilder(); long value = byteArrayToLong(data); do { int index = (int) (value % BASE62); sb.append(BASE62_CHARS.charAt(index)); value /= BASE62; } while (value > 0); return sb.reverse().toString(); } // 解码方法 public static byte[] decode(String base62String) { long value = 0L; for (char c : base62String.toCharArray()) { Integer index = CHAR_TO_INDEX_MAP.get(c); if (index == null) { throw new IllegalArgumentException("Invalid Base62 character: " + c); } value = value * BASE62 + index; } return longToByteArray(value); } // 将字节数组转换为长整型 private static long byteArrayToLong(byte[] data) { long value = 0L; for (byte b : data) { value = (value << 8) | (b & 0xFF); } return value; } // 将长整型转换为字节数组 private static byte[] longToByteArray(long value) { byte[] data = new byte[8]; for (int i = 7; i >= 0 && value > 0; i--) { data[i] = (byte) (value & 0xFF); value >>= 8; } return data; } // 测试用例 public static void main(String[] args) { String originalData = "HelloWorld"; byte[] encodedBytes = originalData.getBytes(); String encodedString = encode(encodedBytes); System.out.println("Encoded: " + encodedString); byte[] decodedBytes = decode(encodedString); String decodedString = new String(decodedBytes).trim(); System.out.println("Decoded: " + decodedString); } } ``` #### 注意事项 - **字符集选择**:Base62 的字符集可以根据需求自定义,但通常采用 `0-9`、`A-Z` `a-z` 的组合。 - **长度限制**:由于此实现仅适用于较小的数据量,对于大文件或大数据量的处理可能需要优化。 - **兼容性问题**:不同平台或库之间的 Base62 实现可能存在差异,需确保编码解码逻辑一致。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值