我需要即时将上传的二进制文件转换为 base64 字符串格式。我正在使用 ASP,Vbscript。使用 Midori 的组件进行 base64 转换。对于小尺寸文件(<20K),性能还可以。但是当它超过 75 或 100K 时,它就完全丢失了。有没有什么有效的方法可以将大二进制文件(2MB)转换为 base64 字符串格式?
在此先感谢,肯尼
我需要即时将上传的二进制文件转换为 base64 字符串格式。我正在使用 ASP,Vbscript。使用 Midori 的组件进行 base64 转换。对于小尺寸文件(<20K),性能还可以。但是当它超过 75 或 100K 时,它就完全丢失了。有没有什么有效的方法可以将大二进制文件(2MB)转换为 base64 字符串格式?
在此先感谢,肯尼
我通过实现一个用于转换为 base64 字符串的 .net 组件解决了这个问题。困难的部分是从 ASP 发送到 .net COM 的二进制数据作为字符串接收。Convert.ToBase64() 仅接受 byte[]。所以我尝试将字符串转换为字节 []。
但是 .net 中可用的编码(Unicode、ASCII、UTF)不能正常工作。在使用这些编码时,存在数据丢失。最后我通过使用 StringReader 对象来完成它。通过 char(16 bit) 读取 char 并将它们转换为 (8 bit) byte[] 数组。
而且性能最好。
问候,西瓦。
您应该使用 .NET 方法 Convert.ToBase64String 和 Convert.FromBase64String。
使用 Convert.FromBase64String( ) 方法。这将为您返回二进制数据(作为字节数组)。
要将二进制数据转换为 Base64 字符串,请参阅从二进制数据到 vbscript 中的字符串的转换函数
来自http://www.motobit.com/tips/detpg_Base64Encode/
Function Base64EncodeBinary(inData)
Base64EncodeBinary = Base64Encode(BinaryToString(inData))
End Function
Function Base64Encode(inData)
'rfc1521
'2001 Antonin Foller, Motobit Software, http://Motobit.cz
Const Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
Dim cOut, sOut, I
'For each group of 3 bytes
For I = 1 To Len(inData) Step 3
Dim nGroup, pOut, sGroup
'Create one long from this 3 bytes.
nGroup = &H10000 * Asc(Mid(inData, I, 1)) + _
&H100 * MyASC(Mid(inData, I + 1, 1)) + MyASC(Mid(inData, I + 2, 1))
'Oct splits the long To 8 groups with 3 bits
nGroup = Oct(nGroup)
'Add leading zeros
nGroup = String(8 - Len(nGroup), "0") & nGroup
'Convert To base64
pOut = Mid(Base64, CLng("&o" & Mid(nGroup, 1, 2)) + 1, 1) + _
Mid(Base64, CLng("&o" & Mid(nGroup, 3, 2)) + 1, 1) + _
Mid(Base64, CLng("&o" & Mid(nGroup, 5, 2)) + 1, 1) + _
Mid(Base64, CLng("&o" & Mid(nGroup, 7, 2)) + 1, 1)
'Add the part To OutPut string
sOut = sOut + pOut
'Add a new line For Each 76 chars In dest (76*3/4 = 57)
'If (I + 2) Mod 57 = 0 Then sOut = sOut + vbCrLf
Next
Select Case Len(inData) Mod 3
Case 1: '8 bit final
sOut = Left(sOut, Len(sOut) - 2) + "=="
Case 2: '16 bit final
sOut = Left(sOut, Len(sOut) - 1) + "="
End Select
Base64Encode = sOut
End Function
Function MyASC(OneChar)
If OneChar = "" Then MyASC = 0 Else MyASC = Asc(OneChar)
End Function
使用 MSXML 为您进行编码。这是封装该过程的函数:-
Function ToBase64(rabyt)
Dim xml: Set xml = CreateObject("MSXML2.DOMDocument.3.0")
xml.LoadXml "<root />"
xml.documentElement.dataType = "bin.base64"
xml.documentElement.nodeTypedValue = rabyt
ToBase64 = xml.documentElement.Text
End Function
请注意,这将包括 base64 编码中的换行符,但大多数 base64 解码器都可以容忍换行符。如果不是,您可以简单地使用Replace(base64, vbLF, "")
来删除它们,这仍然比纯 VBScript 解决方案更快。
编辑示例用法:-
Dim sBase64: sBase64 = ToBase64(Request.BinaryRead(Request.TotalBytes))
我使用 c# 的下一个代码:
public static string ImageToBase64(Image image, ImageFormat format)
{
using (MemoryStream ms = new MemoryStream())
{
// Convert Image to byte[]
image.Save(ms, format);
byte[] imageBytes = ms.ToArray();
// Convert byte[] to Base64 String
string base64String = Convert.ToBase64String(imageBytes);
return base64String;
}
}
public static Image Base64ToImage(string base64String)
{
// Convert Base64 String to byte[]
byte[] imageBytes = Convert.FromBase64String(base64String);
MemoryStream ms = new MemoryStream(imageBytes, 0,
imageBytes.Length);
// Convert byte[] to Image
ms.Write(imageBytes, 0, imageBytes.Length);
Image image = Image.FromStream(ms, true);
return image;
}
对于 vbscript,请参阅http://www.freevbcode.com/ShowCode.asp?ID=5248可能会对您有所帮助。
在base64-encode-string-in-vbscript中有一个很好的讨论。
此外,我发现这个站点对于尝试从 vb 代码中获取速度很有用。对于 vb6,有几种基于 64 的变体,速度非常快。
这对我有用
Function Base64DataURI(url)
'Create an Http object, use any of the four objects
Dim Http
Set Http = CreateObject("WinHttp.WinHttpRequest.5.1")
'Send request To URL
Http.Open "GET", url, False
Http.Send
'Get response data As a string and encode as base64
Base64DataURI = Encrypt(Http.ResponseText)
End Function
在我的例子中,URL 是一个动态生成条形码的脚本,需要对其进行编码以将其包含在电子邮件中。
Encrypt 是我们用来编码为 Base64 的一个非常标准的函数,但我们需要的主要概念是通过 URL 而不是文件系统获取文件。