Преобразование двоичного файла в строку Base64 - PullRequest
6 голосов
/ 13 июля 2009

Мне нужно конвертировать загруженные двоичные файлы в формат строки base64 на лету. Я использую ASP, Vbscript. Использование компонента Midori для преобразования base64. Для файлов малого размера (<20 КБ) производительность нормальная. Но когда он превышает 75 или 100К, он полностью теряется. Есть ли эффективный способ преобразования больших двоичных файлов (2 МБ) в формат строки base64? </p>

Спасибо заранее, Кинни

Ответы [ 6 ]

2 голосов
/ 29 июля 2009

Я решил эту проблему, реализовав компонент .net для преобразования в строку base64. Сложная часть - это двоичные данные, отправленные в .net COM из ASP, полученные в виде строки. Convert.ToBase64 () принимает только byte []. Поэтому я попытался преобразовать строку в байт [].

Но кодировка, доступная в .net (Unicode, ASCII, UTF), не работает нормально. Есть потеря данных, в то время как эти кодировки используются. Наконец, я получаю это с помощью объекта StringReader. Чтение char на char (16 бит) и преобразование их в (8 бит) массив байтов [].

И производительность лучшая.

С уважением, Шив.

1 голос
/ 13 июля 2009

Вы должны использовать методы .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
0 голосов
/ 03 июня 2016

Вот что у меня сработало

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-адрес представляет собой скрипт, который генерирует штрих-код на лету, и его необходимо кодировать, чтобы включить в электронные письма.

Шифрование - довольно стандартная функция, которую мы используем для кодирования в виде Base64, но основная концепция, которая нам нужна, состояла в том, чтобы получить файл через URL, а не файловую систему.

0 голосов
/ 15 июля 2009

Это хорошо обсуждается в base64-encode-string-in-vbscript .

Кроме того, я нашел этот сайт полезным для попытки получить скорость из кода VB. Есть несколько вариантов base 64 для vb6, которые довольно быстрые.

0 голосов
/ 14 июля 2009

Я использую следующий код для 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 может быть, вам поможет.

0 голосов
/ 14 июля 2009

Используйте 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...