<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>WinSoft.se &#187; Streams</title>
	<atom:link href="http://www.winsoft.se/tag/streams/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.winsoft.se</link>
	<description>Development with focus on Visual Basic .NET</description>
	<lastBuildDate>Thu, 26 Jan 2012 19:28:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Compressing a web request</title>
		<link>http://www.winsoft.se/2010/09/compressing-a-web-request/</link>
		<comments>http://www.winsoft.se/2010/09/compressing-a-web-request/#comments</comments>
		<pubDate>Sun, 12 Sep 2010 12:47:41 +0000</pubDate>
		<dc:creator>Anders Hesselbom</dc:creator>
				<category><![CDATA[Visual Basic 9]]></category>
		<category><![CDATA[Streams]]></category>

		<guid isPermaLink="false">http://www.winsoft.se/?p=1373</guid>
		<description><![CDATA[Perhaps you remember my old GZip example that illustrated how to use the GZip compression feature of the .NET Framework. To follow, read the Main function. It starts with a 118 character string that is compressed to a array of 208 bytes, than decompressed and displayed. (The functions are not changed since wrote about them [...]]]></description>
			<content:encoded><![CDATA[<p>Perhaps you remember my old GZip example that illustrated how to use the GZip compression feature of the .NET Framework. To follow, read the Main function. It starts with a 118 character string that is compressed to a array of 208 bytes, than decompressed and displayed.</p>
<p>(The functions are not changed since wrote about them the last time.)</p>
<pre class="csharpcode">
<span class="kwrd">Module</span> Module1

    <span class="kwrd">Sub</span> Main()

        <span class="rem">'Create some text.</span>
      <span class="kwrd">Dim</span> S <span class="kwrd">As</span> <span class="kwrd">String</span> = <span class="str">"This is some text that I want to compress. "</span> &amp; _
      <span class="str">"Preferably it's a long string loaded from a text file or some XML document."</span>
      Console.WriteLine(<span class="str">"Original string charachter count: {0}"</span>, S.Length)

        <span class="rem">'Assign the compressed version to the variable B.</span>
      <span class="kwrd">Dim</span> B() <span class="kwrd">As</span> <span class="kwrd">Byte</span> = CompressText(S.ToString())
      Console.WriteLine(<span class="str">"Compressed to bytes: {0}"</span>, B.Length)

        <span class="rem">'Decompress it, and display the result.</span>
      <span class="kwrd">Dim</span> Decompressed <span class="kwrd">As</span> <span class="kwrd">String</span> = DecompressText(B)
      Console.WriteLine(<span class="str">"Decompressed text:"</span>)
        Console.WriteLine(Decompressed)

      Console.WriteLine()
      Console.Write(<span class="str">"Press Enter to quit."</span>)
      Console.ReadLine()

    <span class="kwrd">End</span> <span class="kwrd">Sub</span>

    <span class="kwrd">Private</span> <span class="kwrd">Function</span> CompressText(<span class="kwrd">ByVal</span> T <span class="kwrd">As</span> <span class="kwrd">String</span>) <span class="kwrd">As</span> <span class="kwrd">Byte</span>()
        <span class="kwrd">Dim</span> B() <span class="kwrd">As</span> <span class="kwrd">Byte</span> = System.Text.Encoding.UTF8.GetBytes(T)
        Using MemStream <span class="kwrd">As</span> <span class="kwrd">New</span> System.IO.MemoryStream()
            Using GZStream <span class="kwrd">As</span> <span class="kwrd">New</span> System.IO.Compression.GZipStream(MemStream, _
             IO.Compression.CompressionMode.Compress)
                GZStream.Write(B, 0, B.Length)
                GZStream.Close()
                <span class="kwrd">Return</span> MemStream.ToArray()
            <span class="kwrd">End</span> Using
        <span class="kwrd">End</span> Using
    <span class="kwrd">End</span> <span class="kwrd">Function</span>

    <span class="kwrd">Private</span> <span class="kwrd">Function</span> DecompressText(<span class="kwrd">ByVal</span> B() <span class="kwrd">As</span> <span class="kwrd">Byte</span>) <span class="kwrd">As</span> <span class="kwrd">String</span>
        <span class="kwrd">Dim</span> Result <span class="kwrd">As</span> <span class="kwrd">New</span> System.Text.StringBuilder()
        Using MemStream <span class="kwrd">As</span> <span class="kwrd">New</span> System.IO.MemoryStream(B)
            Using GZStream <span class="kwrd">As</span> <span class="kwrd">New</span> System.IO.Compression.GZipStream(MemStream, _
             IO.Compression.CompressionMode.Decompress)
                <span class="kwrd">Do</span>
                    <span class="kwrd">Dim</span> Buffer(1023) <span class="kwrd">As</span> <span class="kwrd">Byte</span> <span class="rem">'Note that this makes 1024 bytes in VB.</span>
                    <span class="kwrd">Dim</span> BytesRead <span class="kwrd">As</span> <span class="kwrd">Integer</span> = GZStream.Read(Buffer, 0, 1024)
                    <span class="kwrd">If</span> BytesRead &gt; 0 <span class="kwrd">Then</span>
                        Result.Append(System.Text.Encoding.UTF8.GetString(Buffer, 0, BytesRead))
                    <span class="kwrd">End</span> <span class="kwrd">If</span>
                    <span class="kwrd">If</span> BytesRead &lt; 1024 <span class="kwrd">Then</span>
                        <span class="kwrd">Exit</span> <span class="kwrd">Do</span>
                    <span class="kwrd">End</span> <span class="kwrd">If</span>
                <span class="kwrd">Loop</span>
                GZStream.Close()
                <span class="kwrd">Return</span> Result.ToString()
            <span class="kwrd">End</span> Using
        <span class="kwrd">End</span> Using
    <span class="kwrd">End</span> <span class="kwrd">Function</span>

<span class="kwrd">End</span> <span class="kwrd">Module</span>
</pre>
<p>You will need more data to get a positive effect of compression, and that is one thing to consider when you decide if to compress your data. Another thing to keep in mind is that compressed data isn&#8217;t searchable.</p>
<p>If you were to build a web browser, one elementary thing that your program must be able to do, is to make a web request via http and download the response. This ability is also built in into the framework. This function (takes an URL and returns the HTML response) does just that:</p>
<pre class="csharpcode">
<span class="kwrd">Private</span> <span class="kwrd">Function</span> DoWebRequest(<span class="kwrd">ByVal</span> URL <span class="kwrd">As</span> <span class="kwrd">String</span>) <span class="kwrd">As</span> <span class="kwrd">String</span>
   <span class="kwrd">Dim</span> Result <span class="kwrd">As</span> <span class="kwrd">String</span> = <span class="str">""</span>
   Using Wc <span class="kwrd">As</span> <span class="kwrd">New</span> System.Net.WebClient()
      <span class="kwrd">Dim</span> S <span class="kwrd">As</span> System.IO.Stream = Wc.OpenRead(URL)
      Using R <span class="kwrd">As</span> <span class="kwrd">New</span> System.IO.StreamReader(S)
         Result = R.ReadToEnd()
      <span class="kwrd">End</span> Using
   <span class="kwrd">End</span> Using
   <span class="kwrd">Return</span> Result
<span class="kwrd">End</span> Function</pre>
<p>Now, if I do a small change to the program, so that it downloads the response from a specific website, and compresses that, the numbers will be better. This is what the code looks like:</p>
<pre class="csharpcode">
<span class="kwrd">Sub</span> Main()

   <span class="rem">'Create some text.</span>
   <span class="kwrd">Dim</span> S <span class="kwrd">As</span> <span class="kwrd">String</span> = DoWebRequest(<span class="str">"http://www.hurhomeopatifungerar.se/"</span>)
   Console.WriteLine(<span class="str">"Original string charachter count: {0}"</span>, S.Length)

   <span class="rem">'Assign the compressed version to the variable B.</span>
   <span class="kwrd">Dim</span> B() <span class="kwrd">As</span> <span class="kwrd">Byte</span> = CompressText(S.ToString())
   Console.WriteLine(<span class="str">"Compressed to bytes: {0}"</span>, B.Length)

   <span class="rem">'Decompress it, and display the result.</span>
   <span class="kwrd">Dim</span> Decompressed <span class="kwrd">As</span> <span class="kwrd">String</span> = DecompressText(B)
   Console.WriteLine(<span class="str">"Decompressed text:"</span>)
   Console.WriteLine(Decompressed)

   Console.WriteLine()
   Console.Write(<span class="str">"Press Enter to quit."</span>)
   Console.ReadLine()

<span class="kwrd">End</span> Sub</pre>
<p>This specific website gives a 2179 characters long response, that is compressed to 1359 bytes. This is the complete code:</p>
<pre class="csharpcode">
<span class="kwrd">Module</span> Module1

    <span class="kwrd">Sub</span> Main()

        <span class="rem">'Create some text.</span>
      <span class="kwrd">Dim</span> S <span class="kwrd">As</span> <span class="kwrd">String</span> = DoWebRequest(<span class="str">"http://www.hurhomeopatifungerar.se/"</span>)
      Console.WriteLine(<span class="str">"Original string charachter count: {0}"</span>, S.Length)

        <span class="rem">'Assign the compressed version to the variable B.</span>
      <span class="kwrd">Dim</span> B() <span class="kwrd">As</span> <span class="kwrd">Byte</span> = CompressText(S.ToString())
      Console.WriteLine(<span class="str">"Compressed to bytes: {0}"</span>, B.Length)

        <span class="rem">'Decompress it, and display the result.</span>
      <span class="kwrd">Dim</span> Decompressed <span class="kwrd">As</span> <span class="kwrd">String</span> = DecompressText(B)
      Console.WriteLine(<span class="str">"Decompressed text:"</span>)
        Console.WriteLine(Decompressed)

      Console.WriteLine()
      Console.Write(<span class="str">"Press Enter to quit."</span>)
      Console.ReadLine()

    <span class="kwrd">End</span> <span class="kwrd">Sub</span>

   <span class="kwrd">Private</span> <span class="kwrd">Function</span> DoWebRequest(<span class="kwrd">ByVal</span> URL <span class="kwrd">As</span> <span class="kwrd">String</span>) <span class="kwrd">As</span> <span class="kwrd">String</span>
      <span class="kwrd">Dim</span> Result <span class="kwrd">As</span> <span class="kwrd">String</span> = <span class="str">""</span>
      Using Wc <span class="kwrd">As</span> <span class="kwrd">New</span> System.Net.WebClient()
         <span class="kwrd">Dim</span> S <span class="kwrd">As</span> System.IO.Stream = Wc.OpenRead(URL)
         Using R <span class="kwrd">As</span> <span class="kwrd">New</span> System.IO.StreamReader(S)
            Result = R.ReadToEnd()
         <span class="kwrd">End</span> Using
      <span class="kwrd">End</span> Using
      <span class="kwrd">Return</span> Result
   <span class="kwrd">End</span> <span class="kwrd">Function</span>

    <span class="kwrd">Private</span> <span class="kwrd">Function</span> CompressText(<span class="kwrd">ByVal</span> T <span class="kwrd">As</span> <span class="kwrd">String</span>) <span class="kwrd">As</span> <span class="kwrd">Byte</span>()
        <span class="kwrd">Dim</span> B() <span class="kwrd">As</span> <span class="kwrd">Byte</span> = System.Text.Encoding.UTF8.GetBytes(T)
        Using MemStream <span class="kwrd">As</span> <span class="kwrd">New</span> System.IO.MemoryStream()
            Using GZStream <span class="kwrd">As</span> <span class="kwrd">New</span> System.IO.Compression.GZipStream(MemStream, _
             IO.Compression.CompressionMode.Compress)
                GZStream.Write(B, 0, B.Length)
                GZStream.Close()
                <span class="kwrd">Return</span> MemStream.ToArray()
            <span class="kwrd">End</span> Using
        <span class="kwrd">End</span> Using
    <span class="kwrd">End</span> <span class="kwrd">Function</span>

    <span class="kwrd">Private</span> <span class="kwrd">Function</span> DecompressText(<span class="kwrd">ByVal</span> B() <span class="kwrd">As</span> <span class="kwrd">Byte</span>) <span class="kwrd">As</span> <span class="kwrd">String</span>
        <span class="kwrd">Dim</span> Result <span class="kwrd">As</span> <span class="kwrd">New</span> System.Text.StringBuilder()
        Using MemStream <span class="kwrd">As</span> <span class="kwrd">New</span> System.IO.MemoryStream(B)
            Using GZStream <span class="kwrd">As</span> <span class="kwrd">New</span> System.IO.Compression.GZipStream(MemStream, _
             IO.Compression.CompressionMode.Decompress)
                <span class="kwrd">Do</span>
                    <span class="kwrd">Dim</span> Buffer(1023) <span class="kwrd">As</span> <span class="kwrd">Byte</span> <span class="rem">'Note that this makes 1024 bytes in VB.</span>
                    <span class="kwrd">Dim</span> BytesRead <span class="kwrd">As</span> <span class="kwrd">Integer</span> = GZStream.Read(Buffer, 0, 1024)
                    <span class="kwrd">If</span> BytesRead &gt; 0 <span class="kwrd">Then</span>
                        Result.Append(System.Text.Encoding.UTF8.GetString(Buffer, 0, BytesRead))
                    <span class="kwrd">End</span> <span class="kwrd">If</span>
                    <span class="kwrd">If</span> BytesRead &lt; 1024 <span class="kwrd">Then</span>
                        <span class="kwrd">Exit</span> <span class="kwrd">Do</span>
                    <span class="kwrd">End</span> <span class="kwrd">If</span>
                <span class="kwrd">Loop</span>
                GZStream.Close()
                <span class="kwrd">Return</span> Result.ToString()
            <span class="kwrd">End</span> Using
        <span class="kwrd">End</span> Using
    <span class="kwrd">End</span> <span class="kwrd">Function</span>

<span class="kwrd">End</span> <span class="kwrd">Module</span>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.winsoft.se/2010/09/compressing-a-web-request/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Decompressing text</title>
		<link>http://www.winsoft.se/2010/06/decompressing-text/</link>
		<comments>http://www.winsoft.se/2010/06/decompressing-text/#comments</comments>
		<pubDate>Sat, 12 Jun 2010 12:50:44 +0000</pubDate>
		<dc:creator>Anders Hesselbom</dc:creator>
				<category><![CDATA[Visual Basic 9]]></category>
		<category><![CDATA[Streams]]></category>

		<guid isPermaLink="false">http://www.winsoft.se/?p=1211</guid>
		<description><![CDATA[This post shows how to compress a String to reduce the amount memory it consumes, and this post shows how to use the CompressText function. To be able to read the content of the string, it must be decompressed (or inflated) again. The DecompressText function is one way to do this. Private Function DecompressText(ByVal B() [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.winsoft.se/2009/11/compressing-text/">This post</a> shows how to compress a String to reduce the amount memory it consumes, and <a href="http://www.winsoft.se/2009/11/compressing-genesis/">this post</a> shows how to use the <strong>CompressText</strong> function. To be able to read the content of the string, it must be decompressed (or inflated) again. The <strong>DecompressText</strong> function is one way to do this.</p>
<pre>Private Function DecompressText(ByVal B() As Byte) As String
   Dim Result As New System.Text.StringBuilder()
   Using MemStream As New System.IO.MemoryStream(B)
      Using GZStream As New System.IO.Compression.GZipStream(MemStream, _
         IO.Compression.CompressionMode.Decompress)
      Do
         'Note that this makes 1024 bytes in VB.
         Dim Buffer(1023) As Byte
         Dim BytesRead As Integer = GZStream.Read(Buffer, 0, 1024)
         If BytesRead > 0 Then
            Result.Append( _
               System.Text.Encoding.UTF8.GetString(Buffer, 0, BytesRead))
         End If
         If BytesRead < 1024 Then
            Exit Do
         End If
      Loop
      GZStream.Close()
      Return Result.ToString()
      End Using
   End Using
End Function</pre>
<p>Now, imagine that <strong>B</strong> is a byte array returned from the <strong>CompressText</strong> function. <strong>B</strong> holds the bytes of a compressed text string. <strong>B</strong> is passed to the <strong>DecompressText</strong> function and the function returns the inflated string again. Example:</p>
<pre>'Create some text.
Dim S As String = "This is some text that I want to compress. Preferably it's " &#038; _
"a long string loaded from a text file or some XML document."

'Assign the compressed version to the variable B.
Dim B() As Byte = CompressText(S.ToString())

'Decompress it, and display the result.
Dim Decompressed As String = DecompressText(B)
Console.WriteLine(Decompressed)</pre>
<p>Have you seen a more elegant way to handle strings in memory than what the .NET Framework offers?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.winsoft.se/2010/06/decompressing-text/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Compressing Genesis</title>
		<link>http://www.winsoft.se/2009/11/compressing-genesis/</link>
		<comments>http://www.winsoft.se/2009/11/compressing-genesis/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 12:11:00 +0000</pubDate>
		<dc:creator>Anders Hesselbom</dc:creator>
				<category><![CDATA[Visual Basic 9]]></category>
		<category><![CDATA[Streams]]></category>

		<guid isPermaLink="false">http://www.winsoft.se/?p=706</guid>
		<description><![CDATA[From here, I have downloaded Genesis to see what the GZip stream is good for. GZip is suitable for compressing text, because the file format is totally clean (uncompressed) and the Deflate algorithm manages therefore to compress text to a high ratio. And I like the simile that deflating Genesis leaves very little left. It [...]]]></description>
			<content:encoded><![CDATA[<p>From <a href="http://atschool.eduweb.co.uk/sbs777/bible/text/" target="_blank">here</a>, I have downloaded Genesis to see what the GZip stream is good for. GZip is suitable for compressing text, because the file format is totally clean (uncompressed) and the Deflate algorithm manages therefore to compress text to a high ratio. And I like the simile that deflating Genesis leaves very little left. It sort of works with my naturalistic worldview.</p>
<p>The function, <a href="http://www.winsoft.se/2009/11/compressing-text/">CompressText</a> is unchanged, so I only show the Main subroutine.</p>
<pre class="csharpcode">
<span class="kwrd">Sub</span> Main()

    <span class="rem">'Load genesis.</span>
    <span class="kwrd">Dim</span> S <span class="kwrd">As</span> <span class="kwrd">String</span>
    Using Sr <span class="kwrd">As</span> <span class="kwrd">New</span> System.IO.StreamReader(<span class="str">"genesis.txt"</span>, System.Text.Encoding.UTF8)
        S = Sr.ReadToEnd()
        Sr.Close()
    <span class="kwrd">End</span> Using

    Console.WriteLine(<span class="str">"{0} characters, {1} bytes."</span>, S.Length, S.Length * 2)

    <span class="rem">'Compress it, and display the result.</span>
    <span class="kwrd">Dim</span> B() <span class="kwrd">As</span> <span class="kwrd">Byte</span> = CompressText(S)
    Console.WriteLine(<span class="str">"Compressed to {0} bytes."</span>, B.Length.ToString())

    Console.WriteLine(<span class="str">"Difference: {0}%"</span>, (((S.Length * 2) / B.Length) * 100).ToString(<span class="str">"n0"</span>))
<span class="kwrd">End</span> Sub</pre>
<p>In this case, the uncompressed version is 588% of the size of the compressed version.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.winsoft.se/2009/11/compressing-genesis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Compressing text</title>
		<link>http://www.winsoft.se/2009/11/compressing-text/</link>
		<comments>http://www.winsoft.se/2009/11/compressing-text/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 20:46:03 +0000</pubDate>
		<dc:creator>Anders Hesselbom</dc:creator>
				<category><![CDATA[Visual Basic 9]]></category>
		<category><![CDATA[Streams]]></category>

		<guid isPermaLink="false">http://www.winsoft.se/?p=701</guid>
		<description><![CDATA[I had a situation today when I had to fit about 12.000 bytes of text in 5.000 byte storage. In .NET, this is so easy to do. Just a few lines of code is required to convert a long String to a short Byte array. Examine the CompressText function. This particular example, compresses 252 characters [...]]]></description>
			<content:encoded><![CDATA[<p>I had a situation today when I had to fit about 12.000 bytes of text in 5.000 byte storage. In .NET, this is so easy to do. Just a few lines of code is required to convert a long <strong>String</strong> to a short <strong>Byte</strong> array. Examine the CompressText function. This particular example, compresses 252 characters to 287 bytes, but on larger text pieces, the effect is better. Enjoy!</p>
<pre class="csharpcode">
<span class="kwrd">Module</span> Module1

    <span class="kwrd">Sub</span> Main()

        <span class="rem">'For the example, create some text!</span>
        <span class="kwrd">Dim</span> S <span class="kwrd">As</span> <span class="kwrd">New</span> System.Text.StringBuilder()
        S.Append(<span class="str">"This is some text that I want to compress. "</span>)
        S.Append(<span class="str">"Uncompressed, this text of 252 characters "</span>)
        S.Append(<span class="str">"consumes 504 bytes of memory with UTF-8 "</span>)
        S.Append(<span class="str">"encoding. The effect of the compression "</span>)
        S.Append(<span class="str">"is much better with a larger piece of text. "</span>)
        S.Append(<span class="str">"Compressing XML this way is very effective."</span>)

        <span class="rem">'Compress it, and display the result.</span>
        <span class="kwrd">Dim</span> B() <span class="kwrd">As</span> <span class="kwrd">Byte</span> = CompressText(S.ToString())
        Console.WriteLine(<span class="str">"Compressed to {0} bytes."</span>, B.Length.ToString())

    <span class="kwrd">End</span> <span class="kwrd">Sub</span>

    <span class="kwrd">Private</span> <span class="kwrd">Function</span> CompressText(<span class="kwrd">ByVal</span> T <span class="kwrd">As</span> <span class="kwrd">String</span>) <span class="kwrd">As</span> <span class="kwrd">Byte</span>()
        <span class="kwrd">Dim</span> B() <span class="kwrd">As</span> <span class="kwrd">Byte</span> = System.Text.Encoding.UTF8.GetBytes(T)
        Using MemStream <span class="kwrd">As</span> <span class="kwrd">New</span> System.IO.MemoryStream()
            Using GZStream <span class="kwrd">As</span> <span class="kwrd">New</span> System.IO.Compression.GZipStream(MemStream, _
             IO.Compression.CompressionMode.Compress)
                GZStream.Write(B, 0, B.Length)
                GZStream.Close()
                <span class="kwrd">Return</span> MemStream.ToArray()
            <span class="kwrd">End</span> Using
        <span class="kwrd">End</span> Using
    <span class="kwrd">End</span> <span class="kwrd">Function</span>

<span class="kwrd">End</span> <span class="kwrd">Module</span>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.winsoft.se/2009/11/compressing-text/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

