file - online - Conversión de archivo binario a cadena Base64
que hacen los archivos binarios (6)
Necesito convertir archivos binarios cargados al formato de cadena base64 sobre la marcha. Estoy usando ASP, Vbscript. Usando el componente de Midori para la conversión de base64. Para archivos de tamaño pequeño (<20 K), el rendimiento está bien. Pero cuando supera los 75 o 100 K, está totalmente perdido. ¿Hay alguna forma eficiente de convertir archivos binarios grandes (2MB) a formato de cadena base64?
Gracias de antemano, Kenney
debe usar los métodos .NET Convert.ToBase64String y Convert.FromBase64String.
Use el método Convert.FromBase64String (). Esto le devolverá los datos binarios (como una matriz de bytes).
Para convertir datos binarios en una cadena Base64, vea funciones de conversión de datos binarios a una cadena en vbscript
de 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
Use MSXML para hacer la codificación por usted. Aquí hay una función que encapsula el procedimiento:
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
Tenga en cuenta que esto incluirá saltos de línea en la codificación base64, pero la mayoría de los decodificadores base64 son tolerantes a los saltos de línea. De lo contrario, podría usar Replace(base64, vbLF, "")
para eliminarlos, esto aún será más rápido que una solución VBScript pura.
Editar uso de ejemplo: -
Dim sBase64: sBase64 = ToBase64(Request.BinaryRead(Request.TotalBytes))
Uso el siguiente código para 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;
}
para vbscript ver http://www.freevbcode.com/ShowCode.asp?ID=5248 tal vez te ayude.
He resuelto este problema implementando un componente .net para convertir a cadena base64. La parte difícil es que los datos binarios enviados a .NET COM desde ASP se reciben como una cadena. Convert.ToBase64 () acepta solo byte []. Así que intenté convertir cadena a byte [].
Pero la codificación disponible en .net (Unicode, ASCII, UTF) no funciona bien. Hay pérdida de datos, mientras se usan estas codificaciones. Finalmente lo hago usando el objeto StringReader. Lea char por char (16 bit) y conviértalos en (8 bit) byte [] array.
Y el rendimiento es el mejor.
Saludos, Siva.
Esto es lo que funcionó para mí
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
En mi caso, la URL es una secuencia de comandos que genera un código de barras sobre la marcha y necesita codificar para incluir eso en los correos electrónicos.
Encrypt es una función bastante estándar que utilizamos para codificar como Base64, pero el concepto principal que necesitábamos era obtener el archivo a través de la URL, no del sistema de archivos.
Hay una buena discusión de esto en base64-encode-string-in-vbscript .
Además, he encontrado que este sitio es útil para intentar acelerar el código vb. Hay varias variantes de base 64 allí para vb6 que son bastante rápidas.