2009-07-13 68 views
6

Tôi cần phải chuyển đổi tệp nhị phân đã tải lên thành định dạng chuỗi base64 khi đang di chuyển. Tôi đang sử dụng ASP, Vbscript. Sử dụng thành phần của Midori để chuyển đổi base64. Đối với các tệp có kích thước nhỏ (< 20K), hiệu suất vẫn ổn. Nhưng khi nó vượt quá 75 hoặc 100K, nó hoàn toàn bị mất. Có cách nào hiệu quả để chuyển đổi các tệp nhị phân lớn (2MB) thành định dạng chuỗi base64 không?Chuyển đổi tệp nhị phân thành chuỗi Base64

Cảm ơn trước, Kenney

Trả lời

2

Tôi đã giải quyết vấn đề này bằng cách triển khai thành phần .net để chuyển đổi thành chuỗi base64. Phần cứng là dữ liệu nhị phân được gửi tới .net COM từ ASP được nhận dưới dạng chuỗi. Convert.ToBase64() chỉ chấp nhận byte []. Vì vậy, tôi đã cố gắng chuyển đổi chuỗi thành byte [].

Nhưng mã hóa có sẵn trong .net (Unicode, ASCII, UTF) không hoạt động tốt. Có mất dữ liệu, trong khi các mã hóa này được sử dụng. Cuối cùng tôi hoàn thành nó bằng cách sử dụng đối tượng StringReader. Đọc char bằng char (16 bit) và chuyển chúng thành (8 bit) byte [] mảng.

Và hiệu suất là tốt nhất.

Trân trọng, Siva.

+0

Cảm ơn vì giải pháp Siva –

1

bạn nên sử dụng phương pháp NET Convert.ToBase64String và Convert.FromBase64String.

Sử dụng phương thức Convert.FromBase64String(). Điều này sẽ cung cấp cho bạn dữ liệu nhị phân trở lại (dưới dạng mảng byte).

Để chuyển đổi dữ liệu nhị phân thành một chuỗi Base64 thấy chức năng chuyển đổi từ dữ liệu nhị phân thành một chuỗi trong VBScript

từ 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, Mã tương tự đã được triển khai trong thành phần của Midori và tôi đang sử dụng nó. –

+0

Krish, bạn có thể vui lòng cho tôi biết cách thực hiện điều này trong ASP - môi trường VBScript không. Ứng dụng của tôi không hỗ trợ .net :( –

+0

thử điều này. Nó có thể hữu ích – joe

-1

Sử dụng MSXML để làm mã hóa cho bạn. Đây là chức năng đóng gói thủ tục: -

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 

Lưu ý điều này sẽ bao gồm các ngắt dòng trong mã hóa base64 nhưng hầu hết các bộ giải mã base64 đều có khả năng chịu lỗi dòng. Nếu không, bạn có thể sử dụng simpy Replace(base64, vbLF, "") để loại bỏ chúng, điều này vẫn sẽ nhanh hơn một giải pháp VBScript thuần túy.

Sửa Ví dụ sử dụng: -

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

Xin chào, Cảm ơn bạn đã trả lời. Tôi đang chuyển đổi tệp nhị phân thành base64. Tệp nhị phân được đọc từ đối tượng Yêu cầu. loại đầu vào (rabyt)? TIA –

+0

@Kenny: rabyt là một mảng byte. – AnthonyWJones

+0

Hi Anthony W Jo nes, Đối tượng yêu cầu của tôi có nhiều tệp nhị phân được tải lên. Tôi sử dụng BinaryRead() để lấy đối tượng yêu cầu wholde. Và từ byteArray tôi sử dụng MidB() và lấy các tệp riêng lẻ. MidB() trả về các tệp trong chuỗi vartype. Làm cách nào để nhận từng tệp dưới dạng byteArray? –

0

tôi sử dụng mã tiếp theo cho 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; 
    } 

cho VBScript thấy http://www.freevbcode.com/ShowCode.asp?ID=5248 có thể giúp bạn.

+0

Mã C# hữu ích như thế nào trong ngữ cảnh này? – AnthonyWJones

0

Có một cuộc thảo luận tốt về điều này trong base64-encode-string-in-vbscript.

Ngoài ra, tôi đã tìm thấy this site hữu ích khi cố gắng đẩy nhanh tốc độ ra khỏi mã vb. Có một số biến thể của cơ sở 64 ở đó cho vb6 khá nhanh.

0

Đây là những gì làm việc cho tôi

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 

Trong trường hợp của tôi URL là một kịch bản mà tạo ra một mã vạch một cách nhanh chóng và cần thiết để mã hóa làm việc này trong email.

Mã hóa là một hàm khá chuẩn mà chúng tôi sử dụng để mã hóa dưới dạng Base64, nhưng khái niệm chính mà chúng tôi cần là lấy tệp qua hệ thống tệp không phải URL.

Các vấn đề liên quan