【问题标题】:Converting binary file to Base64 string将二进制文件转换为 Base64 字符串
【发布时间】:2010-11-10 06:37:18
【问题描述】:

我需要即时将上传的二进制文件转换为 base64 字符串格式。我正在使用 ASP,Vbscript。使用 Midori 的组件进行 base64 转换。对于小尺寸文件(

提前致谢, 肯尼

【问题讨论】:

    标签: file asp-classic binary base64


    【解决方案1】:

    我通过实现一个用于转换为 base64 字符串的 .net 组件解决了这个问题。困难的部分是从 ASP 发送到 .net COM 的二进制数据作为字符串接收。 Convert.ToBase64() 仅接受 byte[]。所以我尝试将字符串转换为字节[]。

    但是 .net 中可用的编码(Unicode、ASCII、UTF)不能正常工作。在使用这些编码时,存在数据丢失。最后我通过使用 StringReader 对象来完成它。逐个字符(16位)读取字符并将它们转换为(8位)字节[]数组。

    而且性能最好。

    问候, 湿婆。

    【讨论】:

      【解决方案2】:

      您应该使用 .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
      

      【讨论】:

      • Krish,在 Midori 的组件中已经实现了相同的代码,我正在使用它。
      • Krish,请告诉我如何在 ASP - vbscript 环境中完成此操作。我的应用程序不支持 .net :(
      • Krish, SimpleBinaryToString() - 适用于 ASCII 文件,但不适用于二进制文件。我通过将二进制转换为 Ascii 整数代码数组并通过 Midori 的组件转换为 base64 来克服这个问题。问题是,这种转换需要更多时间,而且我无法处理大文件。 :(
      • 我想你可以使用一些软件将数据传输到你的porgram。我很快就会放新代码
      【解决方案3】:

      使用 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))
      

      【讨论】:

      • 您好,感谢您的回复。我正在将二进制文件转换为 base64。从 Request 对象中读取二进制文件。输入的类型(rabyt)是什么? TIA
      • @Kenny: rabyt 是一个字节数组。
      • 嗨 Anthony W Jones,我的请求对象上传了多个二进制文件。我使用 BinaryRead() 来获取整个请求对象。从 byteArray 我使用 MidB() 并获取单个文件。 MidB() 返回字符串 vartype 中的文件。如何将每个文件获取为 byteArray?
      • 如果您在多部分帖子中有多个文件,那么使用经典 ASP 会变得非常棘手,尤其是如果您不能在服务器上包含任何自定义组件。
      【解决方案4】:

      我使用 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 可能会对您有所帮助。

      【讨论】:

        【解决方案5】:

        base64-encode-string-in-vbscript 对此进行了很好的讨论。

        此外,我发现this site 对于尝试从 vb 代码中获取速度很有用。对于 vb6,有几种基于 64 的变体,速度非常快。

        【讨论】:

          【解决方案6】:

          这对我有用

          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 而不是文件系统获取文件。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-01-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-02-24
            相关资源
            最近更新 更多