2009-07-13 48 views
6

アップロードされたバイナリファイルをbase64文字列形式に変換する必要があります。私はASP、VBScriptを使用しています。 Base64変換にMidoriのコンポーネントを使用する。小さなサイズのファイル(< 20K)の場合、パフォーマンスは問題ありません。しかし、それが75または100Kを超えると、それは完全に失われます。大きなバイナリファイル(2MB)をbase64文字列形式に変換する効率的な方法はありますか?事前にバイナリファイルをBase64文字列に変換する

おかげで、 ケニー

答えて

2

この問題は、base64文字列に変換するための.netコンポーネントを実装することで解決しました。難しい部分は、ASPから.net COMに送られたバイナリデータが文字列として受信されることです。 Convert.ToBase64()はbyte []のみを受け入れます。だから、文字列をbyte []に​​変換しようとしました。

しかし、.net(Unicode、ASCII、UTF)で利用できるエンコードは正常に動作しません。これらのエンコードが使用されている間、データが失われます。最後に、StringReaderオブジェクトを使用してそれを完成させます。 char(16ビット)によってcharを読み取り、(8ビット)byte []配列に変換します。

パフォーマンスが最適です。

よろしく、 Siva。

+0

ソリューションのおかげでシヴァ –

1

あなたは.NETメソッドConvert.ToBase64StringとConvert.FromBase64Stringを使用する必要があります。

Convert.FromBase64String()メソッドを使用します。これはバイナリ データを(バイト配列として)返します。 Base64文字列にバイナリデータを変換するには

はあなたのための符号化を行うために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、 同じコードがMidoriのコンポーネントに実装されていますが、私はそれを使用しています。 –

+0

Krish、ASP-vbscript環境でこれを実現する方法を教えてください。私のアプリケーションはサポートしていません.net :( –

+0

これを試してみてください。 – joe

-1

使用MSXMLからVBScriptの

の文字列にバイナリデータから変換関数を参照してください。ここでの手順をカプセル化する機能である: -

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)) 
+0

こんにちは、 私はbase64にバイナリファイルを変換しています。タイプ(入力)(rabyt)?TIA –

+0

@ケニー:rabytはバイト配列です。 – AnthonyWJones

+0

こんにちはAnthony W Jo nes、 リクエストオブジェクトに複数のバイナリファイルがアップロードされています。私はBinaryRead()を使用して、wholdeリクエストオブジェクトを取得します。そして、byteArrayからMidB()を使用して個々のファイルを取得します。 MidB()は文字列vartypeのファイルを返します。各ファイルをbyteArrayとしてどのように取得するのですか? –

0

は、私はC#のために、次のコードを使用します。VBScriptのため

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

は多分あなたを助けるhttp://www.freevbcode.com/ShowCode.asp?ID=5248を参照してください。

+0

このコンテキストではC#コードはどのように役立ちますか? – AnthonyWJones

0

base64-encode-string-in-vbscriptにこれに関する良い議論があります。

さらに、this siteがvbコードからeek速度を試すのに役立つことが判明しました。かなり速いvb6用のベース64のいくつかの変形があります。

0

これは、URLがその場でバーコードを生成し、電子メールでそれを含めるようにエンコードするために必要なスクリプトです。私の場合は私のため

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 

を働いたものです

EncryptはBase64としてエンコードするのに使用するかなり標準的な機能ですが、必要な主なコンセプトはファイルシステムではなくURL経由でファイルを取得することでした。

関連する問題