2009-07-13 183 views
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 (< 20K) 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?Conversión de archivo binario a cadena Base64

Gracias de antemano, Kenney

Respuesta

2

He resuelto este problema mediante la implementación de un componente .NET para la conversión a la 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.

+0

Gracias por la solución Siva –

1

se debe utilizar el Convert.ToBase64String métodos .NET y Convert.FromBase64String.

Utilice el método Convert.FromBase64String(). Esto le proporcionará la información binaria (como una matriz de bytes).

para convertir los datos binarios en una cadena Base64 ver las funciones de conversión de datos binarios en 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 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/" 
    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 
+0

Krish, El mismo código se ha implementado en el componente de Midori y lo estoy usando. –

+0

Krish, ¿podría decirme cómo lograr esto en ASP - entorno vbscript? Mi aplicación no es compatible con .net :( –

+0

intente esto. Podría ser útil – joe

-1

uso MSXML para hacer la codificación para usted. Aquí es función de encapsular 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 

Nota Esto incluye saltos de línea en la codificación base64, pero la mayoría de los decodificadores base64 son tolerantes con los saltos de línea. Si no puede utilizar Simpy Replace(base64, vbLF, "") para eliminarlos, esto seguirá siendo más rápido que una solución VBScript pura.

Editar uso Ejemplo: -

Dim sBase64: sBase64 = ToBase64(Request.BinaryRead(Request.TotalBytes)) 
+0

Hola, Gracias por la respuesta. Estoy convirtiendo un archivo binario a base64. El archivo binario se lee desde el objeto Request. tipo de la entrada (rabyt)? TIA –

+0

@Kenny: rabyt es una matriz de bytes – AnthonyWJones

+0

Hola Anthony W Jo nes, Mi objeto de solicitud tiene múltiples archivos binarios cargados. Yo uso BinaryRead() para recuperar el objeto de solicitud de wholde. Y desde byteArray utilizo MidB() y obtengo los archivos individuales. MidB() devuelve los archivos en string vartype. ¿Cómo obtengo cada archivo como byteArray? –

0

utilizo 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; 
    } 

de VBScript ver http://www.freevbcode.com/ShowCode.asp?ID=5248 tal vez ayudar.

+0

¿Cómo es útil el código C# en este contexto? – AnthonyWJones

0

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 un script que genera un código de barras sobre la marcha y necesaria para codificar para incluir que en los correos electrónicos.

El cifrado 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.

Cuestiones relacionadas