| Answer: |
Sometimes you will run across a situation where you need to convert binary data that represents text back into text. An example of this is getting the results of an HTTP operation from an XMLHttp request in binary form, because you are retrieving non-English unicode text from the site you're querying. Check out this article for more details on getting binary data from XMLHttp.
Whatever the reason, native ASP has a lot of trouble with actually converting binary to text, but ADO can handle the job. The following function uses a disconnected recordset object to convert binary data to text. First we declare the function, setup some constants and create a new recordset (the parameters will be explained in a moment).
<% Function BinToText(varBinData, intDataSizeInBytes) ' as String Const adFldLong = &H00000080 Const adVarChar = 200 Set objRS = Server.CreateObject("ADODB.Recordset") |
Next, we add a field to this recordset of type adVarChar (character field), with our own name of "txt" and including the intDataSizeInBytes parameter we took - this is the number of bytes contained in the binary data that will be converted into text. The last parameter is a setting that allows us to use the AppendChunk method (explained below). Then we open the recordset.
objRS.Fields.Append "txt", adVarChar, intDataSizeInBytes, adFldLong objRS.Open |
Now we need to add a record, append the data in binary form and return it in string form.
objRS.AddNew objRS.Fields("txt").AppendChunk varBinData BinToText = objRS("txt").Value |
AppendChunk takes the binary data and places it into the field called "txt" in our recordset. Because our recordset is a VarChar type, ADO silently converts our data to it's text equivalent when we access the field to return the data on the next line.
Here is the whole function, (along with the cleanup of the objRS variable):
<% ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' Function to convert binary data to text ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Function BinToText(varBinData, intDataSizeInBytes) ' as String Const adFldLong = &H00000080 Const adVarChar = 200 Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Fields.Append "txt", adVarChar, intDataSizeInBytes, adFldLong objRS.Open
objRS.AddNew objRS.Fields("txt").AppendChunk varBinData BinToText = objRS("txt").Value
objRS.Close Set objRS = Nothing End Function %> |
Here is an example of it's use:
<% ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' Function to return binary data ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Function GetHTMLBin(strURL) Dim objXMLHTTP, strReturn Set objXMLHTTP = Server.CreateObject("Microsoft.XMLHTTP")
objXMLHTTP.Open "GET", strURL, False objXMLHTTP.Send Cstr(Rnd())
GetHTMLBin = objXMLHTTP.responseBody Set objXMLHTTP = Nothing End Function
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' Function to convert binary data to text ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Function BinToText(varBinData, intDataSizeInBytes) ' as String Const adFldLong = &H00000080 Const adVarChar = 200 Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Fields.Append "txt", adVarChar, intDataSizeInBytes, adFldLong objRS.Open
objRS.AddNew objRS.Fields("txt").AppendChunk varBinData BinToText = objRS("txt").Value
objRS.Close Set objRS = Nothing End Function
Response.Write BinToText(GetHTMLBin("http://www.4guysfromrolla.com/"), 35000) %> |
|