[Mono-dev] Convert.ToBase64String yields different result than on windows...
Quandary
quandary82 at hailmail.net
Sun Jun 5 14:12:40 EDT 2011
Hmm, strange...
It turns out that when you have
----------------------------------------------------
<%@ Page Language="C#" %>
<script runat="server">
public void WriteImage()
{
// Write image to output stream
// Response.End()
}
</script><% WriteImage(); %>
----------------------------------------------------
You may not have a whitespace/tab/newline between </script> and <%
WriteImage %> ...
Apart from that, although base64 encoding returns a different string on
Windows and Linux,
the string created on Windows can be decoded and returns a valid image
on Linux too, although the base64 string is different for the same image...
Very strange.
I have not yet tested whether the string created on Linux will work on
Windows, but I suppose so.
> On 06/04/2011 08:19 PM, Quandary wrote:
>> Hi,
>>
>> Question on the below code (with mono 2.10.2):
>> I'm converting an image to base64 string, and use this string to embed
>> it on a webpage, there I write the image back in the ResponseStream.
>>
>> For that I use the below code, using
>> Convert.ToBase64String on the image byte array.
>>
>> It seems it results in a different base64 string on Linux than on Windows.
>> With PHP, it doesn't.
>>
>> To reproduce:
>> Encode an image (i used gif format) on Windows to base64.
>> Then put the resulting base64 string into a string on an asp.net
>> website, and base64 decode that string there, writing the image to the
>> output stream.
>> It works fine on Windows.
>> It works fine on Linux.
>> But if you base64 encode the image on windows, and put the result string
>> from windows into the decoding website on Linux, then you will get an
>> invalid image..
>>
>> If you copy the base64 string generated on Windows to Linux into a PHP
>> site, and base64 decode it there, it results in a perfectly fine image.
>>
>> I think this is a bug...
>> And if it is, this should be put into a unit test.
>> Because once base64 values are in a database, you can't just correct the
>> encoding/decoding algorithms, because in the database there will still
>> be values encoded by the old faulty algorithm (I do this in a reporting
>> service solution, to get the logo image for each customer into the
>> header)...
>>
>>
>> Here the code:
>> Note that you need to put a constant as value into variable str to cause
>> the error.
>>
>> ------------------ Code running on Linux
>> string strBase64Content = "base 64 converted image string here";
>> byte[] bt64 = System.Convert.FromBase64String(strBase64Content);
>> //string strMIME = GetImageMime(ref bt64);
>>
>>
>> Response.ContentType = "image/gif"; //strMIME;
>> Response.OutputStream.Write(bt64, 0, strBase64Content.Length);
>> Response.End();
>> --------------------------------------------
>>
>>
>>
>>
>> void _Default_Load(object sender, EventArgs e)
>> {
>> string strPath = Server.MapPath("~/file.gif");
>> System.Drawing.Image imgThisImage =
>> System.Drawing.Image.FromFile(strPath);
>>
>> string str = ImageToBase64(imgThisImage,
>> System.Drawing.Imaging.ImageFormat.Gif);
>>
>>
>> Base64ToImage(str);
>> Response.Write(str);
>> // load event
>> }
>>
>>
>> public string ImageToBase64(System.Drawing.Image image,
>> System.Drawing.Imaging.ImageFormat format)
>> {
>> using (System.IO.MemoryStream ms = new
>> System.IO.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 System.Drawing.Image Base64ToImage(string base64String)
>> {
>> // Convert Base64 String to byte[]
>> byte[] imageBytes = Convert.FromBase64String(base64String);
>> System.IO.MemoryStream ms = new
>> System.IO.MemoryStream(imageBytes, 0, imageBytes.Length);
>>
>> // Convert byte[] to Image
>> ms.Write(imageBytes, 0, imageBytes.Length);
>> System.Drawing.Image image =
>> System.Drawing.Image.FromStream(ms, true);
>> return image;
>> }
>>
More information about the Mono-devel-list
mailing list