<?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>.NET Micro Framework Archives | DMC, Inc.</title>
	<atom:link href="https://static.dmcinfo.com/blog/tag/net-micro-framework/feed/index.xml" rel="self" type="application/rss+xml" />
	<link></link>
	<description></description>
	<lastBuildDate>Wed, 15 Jul 2026 21:45:46 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>

<image>
	<url>https://static.dmcinfo.com/wp-content/uploads/2025/04/site-icon-150x150.png</url>
	<title>.NET Micro Framework Archives | DMC, Inc.</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>DMC Earns Microsoft Gold Partner Status in Application Development and Collaboration and Content</title>
		<link>https://static.dmcinfo.com/blog/28574/dmc-earns-microsoft-gold-partner-status-in-application-development-and-collaboration-and-content/</link>
		
		<dc:creator><![CDATA[DMC]]></dc:creator>
		<pubDate>Thu, 21 Feb 2013 13:52:34 +0000</pubDate>
				<category><![CDATA[Digital Workplace Solutions]]></category>
		<category><![CDATA[PC Application Development]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Web Application Development]]></category>
		<category><![CDATA[.NET Micro Framework]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C# .NET Application Development]]></category>
		<category><![CDATA[MS Visual Studio/.NET]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/28574/dmc-earns-microsoft-gold-partner-status-in-application-development-and-collaboration-and-content/</guid>

					<description><![CDATA[<p>DMC is proud to announce that it has achieved Gold Partner status within the Microsoft Partner Network for the ninth consecutive year.&#160; Microsoft uses Gold Status Competencies to identify top partners&#160;in specific solution areas.&#160; DMC earned gold status this year for&#160;the&#160;Application Development (custom .NET application development) and Collaboration and Content (SharePoint solutions). DMC ranks among [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/28574/dmc-earns-microsoft-gold-partner-status-in-application-development-and-collaboration-and-content/">DMC Earns Microsoft Gold Partner Status in Application Development and Collaboration and Content</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">DMC is proud to announce that it has achieved Gold Partner status within the Microsoft Partner Network for the <strong>ninth consecutive year</strong>.&nbsp; Microsoft uses Gold Status Competencies to identify top partners&nbsp;in specific solution areas.&nbsp; DMC earned gold status this year for&nbsp;the&nbsp;<strong>Application Development</strong> (<a href="/services/embedded-development-and-embedded-programming">custom .NET application development</a>) and <strong>Collaboration and Content</strong> (<a href="/services/digital-workplace-solutions/microsoft-consulting-services">SharePoint solutions</a>).</p>

<p class="wp-block-paragraph">DMC ranks among the top 3% of more than 64,000 Microsoft partners worldwide who have earned a gold competency.&nbsp; By achieving a gold level competency in two areas, <strong>DMC ranks among the top 1% of Microsoft partners worldwide</strong>.&nbsp;</p>

<p class="wp-block-paragraph">To earn a Microsoft gold competency, partners must successfully demonstrate expertise through rigorous exams, culminating in Microsoft certifications. Microsoft requires customer references for successful implementation and customer satisfaction, ensuring the highest quality of services.</p>

<p class="wp-block-paragraph">&quot;In addition to being recognized for delivering world-class <strong>.NET&nbsp;</strong>applications to our clients,&nbsp;gold partner status further demonstrates our expertise in tailoring <strong>SharePoint</strong>, <strong>CRM</strong>, and <strong>Office 365 </strong>solutions to the unique structure and business processes of our clients, says DMC Director of Consulting Services, Rick Rietz. &ldquo;<a href="/about/partners">Partnerships and certifications</a> help DMC stay on top of changes in technology so&nbsp;we can deliver the best solutions for our clients.&rdquo;</p>

<p class="wp-block-paragraph">&ldquo;By achieving a gold competency, partners have demonstrated the highest, most consistent capability and commitment to the latest Microsoft technology,&rdquo; said Jon Roskill, corporate Vice President, Worldwide Partner Group at Microsoft Corp. &ldquo;These partners have a deep expertise that puts them in the top 1% of our partner ecosystem, and their proficiency will help customers drive innovative solutions on the latest Microsoft technology.&rdquo;&nbsp;</p>
<p>The post <a href="https://static.dmcinfo.com/blog/28574/dmc-earns-microsoft-gold-partner-status-in-application-development-and-collaboration-and-content/">DMC Earns Microsoft Gold Partner Status in Application Development and Collaboration and Content</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Automatic Remote Updates and the GHI Electronics EMX</title>
		<link>https://static.dmcinfo.com/blog/29538/automatic-remote-updates-and-the-ghi-electronics-emx/</link>
		
		<dc:creator><![CDATA[DMC]]></dc:creator>
		<pubDate>Tue, 17 May 2011 10:55:23 +0000</pubDate>
				<category><![CDATA[Embedded Development & Programming]]></category>
		<category><![CDATA[.NET Micro Framework]]></category>
		<category><![CDATA[GHI Embedded Master and EMX]]></category>
		<category><![CDATA[MS Visual Studio/.NET]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/29538/automatic-remote-updates-and-the-ghi-electronics-emx/</guid>

					<description><![CDATA[<p>Our first experience with the .NET Micro Framework (NETMF) was on GHI Electronic&apos;s Embedded Master platform, using the .NET Micro Framework 3.0. &#160;We recently had an opportunity to use the GHI&apos;s next generation replacement for the Embedded Master, the EMX module, and the .NET Micro Framework 4.1. &#160;Both Microsoft and GHI have made many changes [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/29538/automatic-remote-updates-and-the-ghi-electronics-emx/">Automatic Remote Updates and the GHI Electronics EMX</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Our first experience with the .NET Micro Framework (NETMF) was on GHI Electronic&apos;s Embedded Master platform, using the .NET Micro Framework 3.0. &nbsp;We recently had an opportunity to use the GHI&apos;s next generation replacement for the Embedded Master, the EMX module, and the .NET Micro Framework 4.1. &nbsp;Both Microsoft and GHI have made many changes to the assemblies, classes and methods.</p>

<p class="wp-block-paragraph">&nbsp;</p>

<p class="wp-block-paragraph">One cool new feature is the SystemUpdate class and the bootloader features that GHI added. &nbsp;In the NETMF 3.0, GHI allowed firmware updates, but now you have an ability to install a bootloader as well. &nbsp;You can deploy a custom bootloader application to the bootloader section and programmatically switch between the two. &nbsp;</p>

<div>&nbsp;</div>

<div>The maximum size of the program that resides in the bootloader section is limited (for the EMX it is 192KB). &nbsp;Automatic updates to the application must be done from the bootloader section. &nbsp;Microsoft&apos;s MFDeploy tool is used to deploy applications to the bootloader just as for the main application. &nbsp;Whichever area the hardware is running from determines which gets written to when you deploy.</div>

<div>&nbsp;</div>

<div>With a fresh EMX out of the box, the first step is to run the following code:</div>

<div>&nbsp;</div>

<div><strong><tt>SystemUpdate.EnableBootloader();</tt></strong></div>

<div>&nbsp;</div>

<div>This will format the program memory into two separate application and bootloader sections.</div>

<div>&nbsp;</div>

<div>When you are in application mode, you can force the EMX to reboot into bootloader mode with:</div>

<div>&nbsp;</div>

<div><strong><tt>SystemUpdate.AccessBootloader();</tt></strong></div>

<div>&nbsp;</div>

<div>You can then manually deploy a bootloader application, or allow your previously written bootloader application to perform the firmware update.</div>

<div>&nbsp;</div>

<div>When you are in bootloader mode, you can force the EMX to reboot back into application mode with:</div>

<div>&nbsp;</div>

<div><strong><tt>SystemUpdate.AccessApplication();</tt></strong></div>

<div>&nbsp;</div>

<div>The system will remember which mode it is in (bootloader versus application) with subsequent reboots until the mode is changed with one of the two above functions, unless the following command is used:</div>

<div>&nbsp;</div>

<div>
<div><strong><tt>SystemUpdate.AlwaysRunBootloader(bool isEnabled);</tt></strong></div>
</div>

<div>&nbsp;</div>

<div>Enabling this mode will cause the system to always boot into the bootloader, after which the application can be reached with the AccessApplication() function.</div>

<div>&nbsp;</div>

<div>Once in bootloader mode, the application is updated as follows:</div>

<div>&nbsp;</div>

<div><strong><tt>SystemUpdate.ApplicationUpdate.Start();</tt></strong></div>

<div><strong><tt>SystemUpdate.ApplicationUpdate.Write(baFWData, iOffset, baFWData.Length);</tt></strong></div>

<div><strong><tt>SystemUpdate.ApplicationUpdate.End();</tt></strong></div>

<div>
<div><strong><tt>SystemUpdate.AccessApplication();</tt></strong></div>
</div>

<div>&nbsp;</div>

<div>For the Write() function, baFWData is the firmware data as a byte array, iOffset is the initial byte within the byte array (typically zero) and, the final value passed in is the number of bytes you wish to write out of the byte array (typically the entire length). &nbsp;For larger applications, you can continue to call the APplicationUpdate.Write() until the entire application has been written, each time passing in new data, before calling ApplicationUpdate.End().</div>

<div>&nbsp;</div>

<div>Errors encountered during the Write() call typically mean that you are writing &apos;bad&apos; data. &nbsp;Keep in mind that .NET Micro Framework applications have a checksum embedded in them, which will cause a fault during writes.&nbsp;</div>

<div>&nbsp;</div>

<div>For our application, our general algorithm was as follows:</div>

<div>1. The main application makes web service calls to a central server to determine if a new application is available for download.</div>

<div>2. If available, the main application downloads the new application through additional web service calls in chunks. &nbsp;The new application is saved to an offboard flash chip.</div>

<div>3. The main application writes a flag to state that the firmware is ready and reboots into the bootloader mode.</div>

<div>4. The bootloader reads the flag, and then reads the firmware from flash and performs the update.</div>

<div>5. The bootloader reboots the system back into application mode.</div>
<p>The post <a href="https://static.dmcinfo.com/blog/29538/automatic-remote-updates-and-the-ghi-electronics-emx/">Automatic Remote Updates and the GHI Electronics EMX</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Fast Embedded Prototyping: GHI Electronic&#8217;s FEZ Cobra</title>
		<link>https://static.dmcinfo.com/blog/29820/fast-embedded-prototyping-ghi-electronics-fez-cobra/</link>
		
		<dc:creator><![CDATA[DMC]]></dc:creator>
		<pubDate>Fri, 25 Jun 2010 10:56:31 +0000</pubDate>
				<category><![CDATA[Embedded Development & Programming]]></category>
		<category><![CDATA[.NET Micro Framework]]></category>
		<category><![CDATA[GHI Embedded Master and EMX]]></category>
		<category><![CDATA[MS Visual Studio/.NET]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/29820/fast-embedded-prototyping-ghi-electronics-fez-cobra/</guid>

					<description><![CDATA[<p>In an ideal world, a design project has well-defined phases with appropriate time allotted for each milestone. &#160;In the real world, clients often bring a project that is already behind schedule, needing results yesterday. Board design can be a cumbersome process, often taking weeks before something physical is ready for the end customer. Breadboarding is [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/29820/fast-embedded-prototyping-ghi-electronics-fez-cobra/">Fast Embedded Prototyping: GHI Electronic&#8217;s FEZ Cobra</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">In an ideal world, a design project has well-defined phases with appropriate time allotted for each milestone. &nbsp;In the real world, clients often bring a project that is already behind schedule, needing results yesterday. Board design can be a cumbersome process, often taking weeks before something physical is ready for the end customer. Breadboarding is an option, but it often isn&#8217;t worth the time to put together a complete system with flimsy connectors that will be difficult to document.</p>



<p class="wp-block-paragraph"><a href="http://www.ghielectronics.com/" target="_blank">GHI Electronics</a> has been pushing the envelope on serious off-the-shelf options with their FEZ product line.  Their robust .NET Micro Framework-based designs make a great solution for many commercial applications.  (Microsoft&#8217;s .NET Micro Framework is a mature, full featured managed embedded programming platform that makes sense for many complex commercial applications.)</p>



<p class="wp-block-paragraph">Their latest addition to this line is the FEZ Cobra, which consists of the EMX module mounted on a board with several peripheral devices and IO points available.  Unlike a starter kit, more IO points are easily available along with many useful peripherals, including Ethernet, USB Host, USB Device, and an LCD connector.  </p>



<p class="wp-block-paragraph">This device is an ideal solution for a client looking to get an initial prototype up and running quickly for testing and verification, prior to designing a final board for the EMX module.  The large amount of easily accessible IO leads allow external prototype circuits to be connected and validated.  (Oftentimes development kits don&#8217;t have enough IO available if the system will use the majority of IO available).  The onboard peripherals allow quick connectivity and programmability.  The robust board design is more appropriate for a temporary (or potentially permanent)  field deployment to test the device or interface with a larger system compared to a typical development system.  The 6 JST connectors allow connection to one of several off-the-shelf peripherals (see the FEZ Cobra Components).</p>



<p class="wp-block-paragraph">Of course, the Embedded Master and FEZ lines are also well suited to hobbyists&#8217; fun for robot design, interactive display devices, and other fun projects. &nbsp;In the commercial world where the hardware platform is decided by expected volume, target price per unit, engineering cost, and calendar development time, the FEZ Cobra platform definitely has found its spot.&nbsp;</p>



<p class="wp-block-paragraph"><a href="/services/embedded-development-and-embedded-programming">Learn more about DMC&#8217;s embedded development and embedded programming services.</a></p>
<p>The post <a href="https://static.dmcinfo.com/blog/29820/fast-embedded-prototyping-ghi-electronics-fez-cobra/">Fast Embedded Prototyping: GHI Electronic&#8217;s FEZ Cobra</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>.NET Micro Framework Midi Player</title>
		<link>https://static.dmcinfo.com/blog/30137/net-micro-framework-midi-player/</link>
		
		<dc:creator><![CDATA[Dan Freve]]></dc:creator>
		<pubDate>Thu, 15 Oct 2009 10:43:32 +0000</pubDate>
				<category><![CDATA[Culture]]></category>
		<category><![CDATA[Embedded Development & Programming]]></category>
		<category><![CDATA[.NET Micro Framework]]></category>
		<category><![CDATA[GHI Embedded Master and EMX]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[MS Visual Studio/.NET]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/30137/net-micro-framework-midi-player/</guid>

					<description><![CDATA[<p>A few days ago, I was working on a project where I needed to control a stepper motor using the .NET Micro Framework on the GHI Embedded Master microprocessor. Stepper motors are a unique type of motor &#8211; the velocity is controlled by a pulse wave input. The faster the pulse frequency, the faster the [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/30137/net-micro-framework-midi-player/">.NET Micro Framework Midi Player</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">A few days ago, I was working on a project where I needed to control a <a href="http://en.wikipedia.org/wiki/Stepper_motor" target="_blank">stepper motor</a> using the <a href="https://www.microsoft.com/en-us/download/details.aspx?id=1434" target="_blank" rel="noreferrer noopener">.NET Micro Framework</a> on the GHI Embedded Master microprocessor. Stepper motors are a unique type of motor &#8211; the velocity is controlled by a pulse wave input. The faster the pulse frequency, the faster the motor rotates.</p>



<p class="wp-block-paragraph">It turns out that most stepper motors will tend to vibrate enough that they can produce quite an audible tone at the frequency at which you are providing pulses. For instance, if you provided a pulse frequency of 440 Hz, the stepper motor would hum the pitch of concert A.</p>



<p class="wp-block-paragraph">It occurred to me very quickly that I could easily program my device to use the stepper motor as a &#8220;speaker&#8221; and play a song! Programming each note one by one seemed too tedious, so I programmed a simple MIDI parser.</p>



<p class="wp-block-paragraph">My project reads a MIDI file in from a USB flash drive, parses the file to gather note events, then plays the song using the <a href="http://en.wikipedia.org/wiki/Pulse-width_modulation" target="_blank">PWM</a> output on the microprocessor.</p>



<p class="wp-block-paragraph">Below is a video of the player in action. Of course, the classic Mario theme was my song of choice!</p>



<p class="wp-block-paragraph"><iframe allowfullscreen="" frameborder="0" height="360" src="https://www.youtube.com/embed/AUtQuSCL-Mk" width="480"></iframe></p>



<p class="wp-block-paragraph">Comments and suggestions are definitely welcome! I&#8217;ve attached my project files, so feel free to build on them.</p>



<p class="wp-block-paragraph"><a href="https://static.dmcinfo.com/wp-content/uploads/2025/06/StepperMotorMidiPlayer.zip">Download Project Files</a></p>
<p>The post <a href="https://static.dmcinfo.com/blog/30137/net-micro-framework-midi-player/">.NET Micro Framework Midi Player</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>I2C and the .NET Micro Framework</title>
		<link>https://static.dmcinfo.com/blog/30200/i2c-and-the-net-micro-framework/</link>
		
		<dc:creator><![CDATA[Dan Freve]]></dc:creator>
		<pubDate>Fri, 04 Sep 2009 08:10:10 +0000</pubDate>
				<category><![CDATA[Embedded Development & Programming]]></category>
		<category><![CDATA[.NET Micro Framework]]></category>
		<category><![CDATA[GHI Embedded Master and EMX]]></category>
		<category><![CDATA[MS Visual Studio/.NET]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/30200/i2c-and-the-net-micro-framework/</guid>

					<description><![CDATA[<p>It is well-known that increasing the number of pins on an integrated circuit (IC) increases its cost. To reduce the number of pins, several serial protocols have been developed to transfer data between IC&#8217;s. One such protocol, I2C, uses only 2 bidirectional open-drain wires. For a recent application, I needed to write a quick class [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/30200/i2c-and-the-net-micro-framework/">I2C and the .NET Micro Framework</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">It is well-known that increasing the number of pins on an integrated circuit (IC) increases its cost. To reduce the number of pins, several serial protocols have been developed to transfer data between IC&#8217;s. One such protocol, I2C, uses only 2 bidirectional open-drain wires.</p>



<p class="wp-block-paragraph">For a recent application, I needed to write a quick class to communicate to a <a href="http://www.newhavendisplay.com/specs/NHD-0220D3Z-NSW-BBW.pdf" target="_blank">Newhaven LCD display</a> over the I2C bus. I&#8217;ll demonstrate how simple it was to get up and running using the Micro Framework.</p>



<p class="wp-block-paragraph">In a <a href="/latest-thinking/blog/id/54/net-micro-framework-and-the-ghi-embedded-master">previous blog</a>, I discussed how easy it is to use the .NET Micro Framework on an embedded target (such as the GHI Embedded Master). Microsoft has made the I2C bus very simple to access on an embedded device. All of this functionality can be accessed using the Microsoft.SPOT.Hardware.I2CDevice class.</p>



<p class="wp-block-paragraph">The first step is to create our I2C class:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C#</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>///&lt;summary>

/// A class for writing text to an LCD Display over the I2C bus
///&lt;/summary>
public class I2CLCDDisplay
{
  private I2CDevice i2c;

  ///&lt;summary>
  /// Initializes a new instance of the I2CLCDDisplay class.
  ///&lt;/summary>
  public I2CLCDDisplay()
  {
    this.i2c = new I2CDevice(
      new I2CDevice.Configuration(0x50 >> 1, 100)
      );
  }</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">///</span><span style="color: #808080">&lt;</span><span style="color: #569CD6">summary</span><span style="color: #808080">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">/// A class for writing text to an LCD Display over the I2C bus</span></span>
<span class="line"><span style="color: #6A9955">///</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">summary</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">I2CLCDDisplay</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">I2CDevice</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">i2c</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">  ///</span><span style="color: #808080">&lt;</span><span style="color: #569CD6">summary</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #6A9955">  /// Initializes a new instance of the I2CLCDDisplay class.</span></span>
<span class="line"><span style="color: #6A9955">  ///</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">summary</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">I2CLCDDisplay</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">  {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">i2c</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">I2CDevice</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">I2CDevice</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Configuration</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">0x50</span><span style="color: #D4D4D4"> &gt;&gt; </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">100</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">      );</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span></code></pre></div>



<p class="wp-block-paragraph">There&#8217;s an important item to note here. From the data sheet of the display, the default I2C address of the device is 0x50. However, the I2C bus uses the least significant bit of the address byte to specify if the command is a read or write command. Thus, we must bit shift the address once to the right to account for this.</p>



<p class="wp-block-paragraph">The next step is to write a public function to write text to the display:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C#</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>///&lt;summary>
/// Writes a string of text to the LCD.
/// Returns true if the write succeeds.
///&lt;/summary>
///&lt;param name="strText">The text to display&lt;/param>
public bool WriteText(String strText)
{
  // First, convert the string of text into an array of bytes
  byte[] buffer = Encoding.UTF8.GetBytes(strText);

  // Create a write transaction with the text as our data
  I2CDevice.I2CTransaction transaction =
    this.i2c.CreateWriteTransaction(buffer);

  // Create a list of transactions to execute.
  // In this case, there is only this one transaction.
  I2CDevice.I2CTransaction[] transationList =
    new I2CDevice.I2CTransaction[] { transaction };

  // Execute the transaction.
  // This call actually sends the data on the I2C bus.
  // We use a timeout of 100ms here, since the data
  // shouldn't take too long to transmit.
  int nSent = this.i2c.Execute(transationList, 100);

  // If the return parameter from "i2c.Execute()" call equals
  // the length of the data that we were trying to send, then
  // the data was sent successfully.
  return (nSent == transaction.Buffer.Length);
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">///</span><span style="color: #808080">&lt;</span><span style="color: #569CD6">summary</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #6A9955">/// Writes a string of text to the LCD.</span></span>
<span class="line"><span style="color: #6A9955">/// Returns true if the write succeeds.</span></span>
<span class="line"><span style="color: #6A9955">///</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">summary</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #6A9955">///</span><span style="color: #808080">&lt;</span><span style="color: #569CD6">param</span><span style="color: #6A9955"> </span><span style="color: #9CDCFE">name</span><span style="color: #6A9955">=</span><span style="color: #CE9178">&quot;strText&quot;</span><span style="color: #808080">&gt;</span><span style="color: #6A9955">The text to display</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">param</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">bool</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">WriteText</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">String</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">strText</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #6A9955">  // First, convert the string of text into an array of bytes</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">byte</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">buffer</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">Encoding</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">UTF8</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetBytes</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">strText</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">  // Create a write transaction with the text as our data</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">I2CDevice</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">I2CTransaction</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">transaction</span><span style="color: #D4D4D4"> =</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">i2c</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">CreateWriteTransaction</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">buffer</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">  // Create a list of transactions to execute.</span></span>
<span class="line"><span style="color: #6A9955">  // In this case, there is only this one transaction.</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">I2CDevice</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">I2CTransaction</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">transationList</span><span style="color: #D4D4D4"> =</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">I2CDevice</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">I2CTransaction</span><span style="color: #D4D4D4">[] { </span><span style="color: #9CDCFE">transaction</span><span style="color: #D4D4D4"> };</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">  // Execute the transaction.</span></span>
<span class="line"><span style="color: #6A9955">  // This call actually sends the data on the I2C bus.</span></span>
<span class="line"><span style="color: #6A9955">  // We use a timeout of 100ms here, since the data</span></span>
<span class="line"><span style="color: #6A9955">  // shouldn&apos;t take too long to transmit.</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">nSent</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">i2c</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Execute</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">transationList</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">100</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">  // If the return parameter from &quot;i2c.Execute()&quot; call equals</span></span>
<span class="line"><span style="color: #6A9955">  // the length of the data that we were trying to send, then</span></span>
<span class="line"><span style="color: #6A9955">  // the data was sent successfully.</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">nSent</span><span style="color: #D4D4D4"> == </span><span style="color: #9CDCFE">transaction</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Buffer</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Length</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">It&#8217;s just that simple! Keep in mind that if your application required a number of commands to be sent in quick succession, you can build a transaction list (I2CDevice.I2CTransaction[]) of the commands, and the I2CDevice class will send them back to back in native code.</p>



<p class="wp-block-paragraph"><a href="/services/embedded-development-and-embedded-programming">Learn more about DMC&#8217;s embedded design and programming services.</a></p>
<p>The post <a href="https://static.dmcinfo.com/blog/30200/i2c-and-the-net-micro-framework/">I2C and the .NET Micro Framework</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Encryption Compatibility Between .NET Micro Framework and the Full .NET Framework</title>
		<link>https://static.dmcinfo.com/blog/30218/encryption-compatibility-between-net-micro-framework-and-the-full-net-framework/</link>
		
		<dc:creator><![CDATA[Tim Jager]]></dc:creator>
		<pubDate>Mon, 24 Aug 2009 16:37:04 +0000</pubDate>
				<category><![CDATA[Embedded Development & Programming]]></category>
		<category><![CDATA[.NET Micro Framework]]></category>
		<category><![CDATA[MS Visual Studio/.NET]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/30218/encryption-compatibility-between-net-micro-framework-and-the-full-net-framework/</guid>

					<description><![CDATA[<p>We are big fans of the .NET Micro Framework. For anyone who hasn&#8217;t heard of it, it&#8217;s a super light version of the .NET Framework that runs on resource-constrained devices embedded systems (read more of our thoughts on .Net Micro Framework). It&#8217;s a great platform, however sometimes we do run into issues. The Micro Framework [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/30218/encryption-compatibility-between-net-micro-framework-and-the-full-net-framework/">Encryption Compatibility Between .NET Micro Framework and the Full .NET Framework</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">We are big fans of the .NET Micro Framework. For anyone who hasn&#8217;t heard of it, it&#8217;s a super light version of the .NET Framework that runs on resource-constrained devices embedded systems (<a href="/latest-thinking/blog/id/54/net-micro-framework-and-the-ghi-embedded-master">read more of our thoughts on .Net Micro Framework</a>).</p>



<p class="wp-block-paragraph">It&#8217;s a great platform, however sometimes we do run into issues. The Micro Framework has lighter versions of some of the core functions built into the standard .NET Framework. The encryption functions built into the standard .NET platform are not directly compatible with the encryption functions built into the Micro Framework. So if you want to encrypt something on a Micro Framework platform and then decrypt it on a standard .NET Framework platform, you will have to implement the Key_TinyEncryptionAlgorithm class in Microsoft.SPOT.Cryptography (which resides in the Micro Framework).</p>



<p class="wp-block-paragraph">Fortunately this class is available and just needs to be added to your project. This will mimic the Microsoft.SPOT.Cryptography functions and allow you to perform the same encryption/decryption on the standard .NET Windows Platform as you would on the Micro Framework platform.</p>



<p class="wp-block-paragraph"><strong>Update Feb. 3, 2010:</strong></p>



<p class="wp-block-paragraph">This algorithm is from Jens Kühner&#8217;s website. Jens Kühner runs a very good blog on the .NET Micro Framework. We actually purchased his book, Expert .NET Micro Framework a while back and found it to be a valuable resource.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C#</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>using System;

namespace Microsoft.SPOT.Cryptography
{
    public sealed class Key_TinyEncryptionAlgorithm
    {
        public const int c_SizeOfKey = 16; //bytes
        private const int c_SizeOfBlock = 8; //bytes
        private const uint c_RoundCount = 32; //number of round cycles
        private const uint c_Delta = 0x9e3779b9;

        private readonly uint[] subKeys;

        public Key_TinyEncryptionAlgorithm(byte[] key)
        {
            if (key == null)
                throw new ArgumentNullException("key");
            System.Diagnostics.Debug.Assert(BitConverter.IsLittleEndian); //be sure to have little endian like on MF

            this.subKeys = CreateSubKeys(key);
        }

        private static uint[] CreateSubKeys(byte[] key)
        {
            //if key is less than keySize it is extended to keySize and padded with zeros
            byte[] paddedKey;
            if (key.Length &lt; c_SizeOfKey)
            {
                paddedKey = new byte&#91;c_SizeOfKey&#93;;
                Array.Copy(key, paddedKey, Math.Min(c_SizeOfKey, key.Length));
            }
            else
                paddedKey = key;

            //convert byte array to DWord array
            uint[] subKeys = new uint&#91;4&#93;;
            for (int i = 0; i &lt; c_SizeOfKey / 4; i++)
                subKeys&#91;i&#93; = BitConverter.ToUInt32(paddedKey, i * 4);
            return subKeys;
        }

        public byte[] Encrypt(byte[] data, int offset, int count, byte[] IV)
        {
            return Modify(true, data, offset, count, IV);
        }

        public byte[] Decrypt(byte[] data, int offset, int count, byte[] IV)
        {
            return Modify(false, data, offset, count, IV);
        }

        private byte[] Modify(bool encrypt, byte[] data, int offset, int count, byte[] IV)
        {
            if (data == null)
                throw new ArgumentNullException("data");
            int length = data.Length;
            if (count &lt; c_SizeOfBlock) //two blocks required
                throw new ArgumentOutOfRangeException("count", "At least 8 bytes required!");
            if (offset &lt; 0 || offset + count > length)
                throw new ArgumentOutOfRangeException("offset");

            //convert initialization vector to block
            //if IV is less than blockSize it is extended to blockSize and padded with zeros
            byte[] paddedIV;
            if (IV == null || IV.Length &lt; c_SizeOfBlock)
            {
                paddedIV = new byte&#91;c_SizeOfBlock&#93;;
                Array.Copy(IV, paddedIV, Math.Min(c_SizeOfBlock, IV.Length));
            }
            else
                paddedIV = IV;
            UInt64 previousCipherBlock = BitConverter.ToUInt64(paddedIV, 0);

            byte[] output = new byte&#91;count&#93;;
            int fullBlockCount = (int)Math.Floor(count / (double)c_SizeOfBlock);
            int totalBlockCount = (int)Math.Ceiling(count / (double)c_SizeOfBlock);
            int remainingByteCount = count % c_SizeOfBlock;
            if (remainingByteCount > 0)
                fullBlockCount--; //handle last full block and last block separately
            int blockNo;
            for (blockNo = 0; blockNo &lt; fullBlockCount; blockNo++)
            {
                if (encrypt)
                {
                    UInt64 plainBlock = BitConverter.ToUInt64(data, offset + blockNo * c_SizeOfBlock);
                    plainBlock ^= previousCipherBlock; //cipher block chaining
                    UInt64 cipherBlock = EncryptBlock(plainBlock);

                    byte[] cipherBlockBytes = BitConverter.GetBytes(cipherBlock);
                    Array.Copy(cipherBlockBytes, 0, output, blockNo * c_SizeOfBlock, c_SizeOfBlock);

                    previousCipherBlock = cipherBlock;
                }
                else
                {
                    UInt64 cipherBlock = BitConverter.ToUInt64(data, offset + blockNo * c_SizeOfBlock);
                    UInt64 plainBlock = DecryptBlock(cipherBlock);
                    plainBlock ^= previousCipherBlock; //cipher block chaining

                    byte[] plainBlockBytes = BitConverter.GetBytes(plainBlock);
                    Array.Copy(plainBlockBytes, 0, output, blockNo * c_SizeOfBlock, c_SizeOfBlock);

                    previousCipherBlock = cipherBlock;
                }
            }

            //cipher byte stealing
            if (remainingByteCount > 0)
            {
                if (encrypt)
                {
                    //last full block
                    UInt64 lastPlainFullBlock = BitConverter.ToUInt64(data, offset + blockNo * c_SizeOfBlock);
                    //cipher block chaining
                    lastPlainFullBlock ^= previousCipherBlock;
                    UInt64 lastCipherFullBlock = EncryptBlock(lastPlainFullBlock);

                    //last part block
                    blockNo++;
                    byte[] paddedBlockBytes = new byte&#91;c_SizeOfBlock&#93;;
                    Array.Copy(data, offset + blockNo * c_SizeOfBlock, paddedBlockBytes, 0, remainingByteCount);
                    UInt64 lastPlainPartBlock = BitConverter.ToUInt64(paddedBlockBytes, 0);
                    //cipher block chaining
                    lastPlainPartBlock ^= lastCipherFullBlock;
                    //steal bytes blockSize - remainingByteCount
                    UInt64 mask = (0xFFFFFFFFFFFFFFFF &lt;&lt; remainingByteCount * 8);
                    lastPlainPartBlock |= lastCipherFullBlock &amp; mask;
                    UInt64 lastCipherPartBlock = EncryptBlock(lastPlainPartBlock);

                    //copy blocks to cipher output
                    //block order is swapped
                    byte[] cipherBlockBytes;
                    //copy extended last part block 
                    cipherBlockBytes = BitConverter.GetBytes(lastCipherPartBlock);
                    for (int i = 0; i &lt; c_SizeOfBlock; ++i)
                        output&#91;(totalBlockCount - 2) * c_SizeOfBlock + i&#93; = cipherBlockBytes&#91;i&#93;;
                    //copy truncated last full block
                    cipherBlockBytes = BitConverter.GetBytes(lastCipherFullBlock);
                    for (int i = 0; i &lt; remainingByteCount; ++i)
                        output&#91;(totalBlockCount - 1) * c_SizeOfBlock + i&#93; = cipherBlockBytes&#91;i&#93;;
                }
                else
                {
                    //last full block
                    UInt64 lastCipherFullBlock = BitConverter.ToUInt64(data, offset + blockNo * c_SizeOfBlock);
                    UInt64 lastPlainFullBlock = DecryptBlock(lastCipherFullBlock);

                    //last part block
                    blockNo++;
                    byte[] paddedBlockBytes = new byte&#91;c_SizeOfBlock&#93;;
                    for (int i = 0; i &lt; remainingByteCount; i++)
                        paddedBlockBytes&#91;i&#93; = data&#91;offset + blockNo * c_SizeOfBlock + i&#93;;
                    UInt64 lastCipherPartBlock = BitConverter.ToUInt64(paddedBlockBytes, 0);
                    //steal bytes blockSize - remainingByteCount
                    UInt64 mask = (0xFFFFFFFFFFFFFFFF &lt;&lt; remainingByteCount * 8);
                    lastCipherPartBlock |= lastPlainFullBlock &amp; mask;
                    UInt64 lastPlainPartBlock = DecryptBlock(lastCipherPartBlock);
                    //cipher block chaining
                    lastPlainPartBlock ^= previousCipherBlock;

                    //cipher block chaining
                    lastPlainFullBlock ^= lastCipherPartBlock;

                    //copy blocks to cipher output
                    //block order is swapped
                    byte[] plainBlockBytes;
                    //copy extended last part block 
                    plainBlockBytes = BitConverter.GetBytes(lastPlainPartBlock);
                    Array.Copy(plainBlockBytes, 0, output, (totalBlockCount - 2) * c_SizeOfBlock, plainBlockBytes.Length);
                    //copy truncated last full block
                    plainBlockBytes = BitConverter.GetBytes(lastPlainFullBlock);
                    for (int i = 0; i &lt; remainingByteCount; ++i)
                        output&#91;(totalBlockCount - 1) * c_SizeOfBlock + i&#93; = plainBlockBytes&#91;i&#93;;
                }
            }
            return output;
        }

        private UInt64 EncryptBlock(UInt64 block)
        {
            uint y = (uint)block;
            uint z = (uint)(block >> 32);

            uint sum = 0;
            uint n = c_RoundCount;
            while (n-- > 0)
            {
                y += ((z &lt;&lt; 4 ^ z >> 5) + z) ^ (sum + this.subKeys&#91;sum &amp; 3&#93;);
                sum += c_Delta;
                z += ((y &lt;&lt; 4 ^ y >> 5) + y) ^ (sum + this.subKeys&#91;sum >> 11 &amp; 3&#93;);
            }

            return (UInt64)y | (UInt64)z &lt;&lt; 32;
        }

        private UInt64 DecryptBlock(UInt64 block)
        {
            uint y = (uint)block;
            uint z = (uint)(block >> 32);

            uint sum = unchecked(c_Delta * c_RoundCount);
            uint n = c_RoundCount;
            while (n-- > 0)
            {
                //y += ((z &lt;&lt; 4 ^ z >> 5) + z) ^ (sum + this.binKey&#91;sum &amp; 3&#93;);
                z -= ((y &lt;&lt; 4 ^ y >> 5) + y) ^ (sum + this.subKeys&#91;sum >> 11 &amp; 3&#93;);
                sum -= c_Delta;
                //z += ((y &lt;&lt; 4 ^ y >> 5) + y) ^ (sum + this.binKey&#91;sum >> 11 &amp; 3&#93;);
                y -= ((z &lt;&lt; 4 ^ z >> 5) + z) ^ (sum + this.subKeys&#91;sum &amp; 3&#93;);
            }
            return (UInt64)y | (UInt64)z &lt;&lt; 32;
        }
    }
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">System</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">namespace</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Microsoft</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">SPOT</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Cryptography</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">sealed</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Key_TinyEncryptionAlgorithm</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">c_SizeOfKey</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">16</span><span style="color: #D4D4D4">; </span><span style="color: #6A9955">//bytes</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">c_SizeOfBlock</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">8</span><span style="color: #D4D4D4">; </span><span style="color: #6A9955">//bytes</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">uint</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">c_RoundCount</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">32</span><span style="color: #D4D4D4">; </span><span style="color: #6A9955">//number of round cycles</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">uint</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">c_Delta</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0x9e3779b9</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">readonly</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">uint</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">subKeys</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Key_TinyEncryptionAlgorithm</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">byte</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">key</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">key</span><span style="color: #D4D4D4"> == </span><span style="color: #569CD6">null</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">throw</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">ArgumentNullException</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;key&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">System</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Diagnostics</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Debug</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Assert</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">BitConverter</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">IsLittleEndian</span><span style="color: #D4D4D4">); </span><span style="color: #6A9955">//be sure to have little endian like on MF</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">subKeys</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">CreateSubKeys</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">key</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">static</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">uint</span><span style="color: #D4D4D4">[] </span><span style="color: #DCDCAA">CreateSubKeys</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">byte</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">key</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #6A9955">            //if key is less than keySize it is extended to keySize and padded with zeros</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">byte</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">paddedKey</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">key</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Length</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #9CDCFE">c_SizeOfKey</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">            {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">paddedKey</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">byte</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">c_SizeOfKey</span><span style="color: #D4D4D4">&#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">Array</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Copy</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">key</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">paddedKey</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">Math</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Min</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">c_SizeOfKey</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">key</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Length</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">else</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">paddedKey</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">key</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">            //convert byte array to DWord array</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">uint</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">subKeys</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">uint</span><span style="color: #D4D4D4">&#91;</span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4">&#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #9CDCFE">c_SizeOfKey</span><span style="color: #D4D4D4"> / </span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">++)</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">subKeys</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">&#93; = </span><span style="color: #9CDCFE">BitConverter</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">ToUInt32</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">paddedKey</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> * </span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">subKeys</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">byte</span><span style="color: #D4D4D4">[] </span><span style="color: #DCDCAA">Encrypt</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">byte</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">offset</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">count</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">byte</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">IV</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Modify</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">offset</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">count</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">IV</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">byte</span><span style="color: #D4D4D4">[] </span><span style="color: #DCDCAA">Decrypt</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">byte</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">offset</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">count</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">byte</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">IV</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Modify</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">false</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">offset</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">count</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">IV</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">byte</span><span style="color: #D4D4D4">[] </span><span style="color: #DCDCAA">Modify</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">bool</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">encrypt</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">byte</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">offset</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">count</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">byte</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">IV</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4"> == </span><span style="color: #569CD6">null</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">throw</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">ArgumentNullException</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;data&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">length</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Length</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">count</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #9CDCFE">c_SizeOfBlock</span><span style="color: #D4D4D4">) </span><span style="color: #6A9955">//two blocks required</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">throw</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">ArgumentOutOfRangeException</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;count&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;At least 8 bytes required!&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">offset</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> || </span><span style="color: #9CDCFE">offset</span><span style="color: #D4D4D4"> + </span><span style="color: #9CDCFE">count</span><span style="color: #D4D4D4"> &gt; </span><span style="color: #9CDCFE">length</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">throw</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">ArgumentOutOfRangeException</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;offset&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">            //convert initialization vector to block</span></span>
<span class="line"><span style="color: #6A9955">            //if IV is less than blockSize it is extended to blockSize and padded with zeros</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">byte</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">paddedIV</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">IV</span><span style="color: #D4D4D4"> == </span><span style="color: #569CD6">null</span><span style="color: #D4D4D4"> || </span><span style="color: #9CDCFE">IV</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Length</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #9CDCFE">c_SizeOfBlock</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">            {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">paddedIV</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">byte</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">c_SizeOfBlock</span><span style="color: #D4D4D4">&#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">Array</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Copy</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">IV</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">paddedIV</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">Math</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Min</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">c_SizeOfBlock</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">IV</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Length</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">else</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">paddedIV</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">IV</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #4EC9B0">UInt64</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">previousCipherBlock</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">BitConverter</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">ToUInt64</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">paddedIV</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">byte</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">output</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">byte</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">count</span><span style="color: #D4D4D4">&#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">fullBlockCount</span><span style="color: #D4D4D4"> = (</span><span style="color: #569CD6">int</span><span style="color: #D4D4D4">)</span><span style="color: #9CDCFE">Math</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Floor</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">count</span><span style="color: #D4D4D4"> / (</span><span style="color: #569CD6">double</span><span style="color: #D4D4D4">)</span><span style="color: #9CDCFE">c_SizeOfBlock</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">totalBlockCount</span><span style="color: #D4D4D4"> = (</span><span style="color: #569CD6">int</span><span style="color: #D4D4D4">)</span><span style="color: #9CDCFE">Math</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Ceiling</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">count</span><span style="color: #D4D4D4"> / (</span><span style="color: #569CD6">double</span><span style="color: #D4D4D4">)</span><span style="color: #9CDCFE">c_SizeOfBlock</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">remainingByteCount</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">count</span><span style="color: #D4D4D4"> % </span><span style="color: #9CDCFE">c_SizeOfBlock</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">remainingByteCount</span><span style="color: #D4D4D4"> &gt; </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">fullBlockCount</span><span style="color: #D4D4D4">--; </span><span style="color: #6A9955">//handle last full block and last block separately</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">blockNo</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (blockNo = 0; </span><span style="color: #9CDCFE">blockNo</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #9CDCFE">fullBlockCount</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">blockNo</span><span style="color: #D4D4D4">++)</span></span>
<span class="line"><span style="color: #D4D4D4">            {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">encrypt</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                {</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #4EC9B0">UInt64</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">plainBlock</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">BitConverter</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">ToUInt64</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">offset</span><span style="color: #D4D4D4"> + </span><span style="color: #9CDCFE">blockNo</span><span style="color: #D4D4D4"> * </span><span style="color: #9CDCFE">c_SizeOfBlock</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">plainBlock</span><span style="color: #D4D4D4"> ^= </span><span style="color: #9CDCFE">previousCipherBlock</span><span style="color: #D4D4D4">; </span><span style="color: #6A9955">//cipher block chaining</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #4EC9B0">UInt64</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">cipherBlock</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">EncryptBlock</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">plainBlock</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #569CD6">byte</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">cipherBlockBytes</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">BitConverter</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetBytes</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">cipherBlock</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">Array</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Copy</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">cipherBlockBytes</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">output</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">blockNo</span><span style="color: #D4D4D4"> * </span><span style="color: #9CDCFE">c_SizeOfBlock</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">c_SizeOfBlock</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">previousCipherBlock</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">cipherBlock</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">                }</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">else</span></span>
<span class="line"><span style="color: #D4D4D4">                {</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #4EC9B0">UInt64</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">cipherBlock</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">BitConverter</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">ToUInt64</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">offset</span><span style="color: #D4D4D4"> + </span><span style="color: #9CDCFE">blockNo</span><span style="color: #D4D4D4"> * </span><span style="color: #9CDCFE">c_SizeOfBlock</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #4EC9B0">UInt64</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">plainBlock</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">DecryptBlock</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">cipherBlock</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">plainBlock</span><span style="color: #D4D4D4"> ^= </span><span style="color: #9CDCFE">previousCipherBlock</span><span style="color: #D4D4D4">; </span><span style="color: #6A9955">//cipher block chaining</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #569CD6">byte</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">plainBlockBytes</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">BitConverter</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetBytes</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">plainBlock</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">Array</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Copy</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">plainBlockBytes</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">output</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">blockNo</span><span style="color: #D4D4D4"> * </span><span style="color: #9CDCFE">c_SizeOfBlock</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">c_SizeOfBlock</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">previousCipherBlock</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">cipherBlock</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">                }</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">            //cipher byte stealing</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">remainingByteCount</span><span style="color: #D4D4D4"> &gt; </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">            {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">encrypt</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                {</span></span>
<span class="line"><span style="color: #6A9955">                    //last full block</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #4EC9B0">UInt64</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">lastPlainFullBlock</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">BitConverter</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">ToUInt64</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">offset</span><span style="color: #D4D4D4"> + </span><span style="color: #9CDCFE">blockNo</span><span style="color: #D4D4D4"> * </span><span style="color: #9CDCFE">c_SizeOfBlock</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #6A9955">                    //cipher block chaining</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">lastPlainFullBlock</span><span style="color: #D4D4D4"> ^= </span><span style="color: #9CDCFE">previousCipherBlock</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #4EC9B0">UInt64</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">lastCipherFullBlock</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">EncryptBlock</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">lastPlainFullBlock</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">                    //last part block</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">blockNo</span><span style="color: #D4D4D4">++;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #569CD6">byte</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">paddedBlockBytes</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">byte</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">c_SizeOfBlock</span><span style="color: #D4D4D4">&#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">Array</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Copy</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">offset</span><span style="color: #D4D4D4"> + </span><span style="color: #9CDCFE">blockNo</span><span style="color: #D4D4D4"> * </span><span style="color: #9CDCFE">c_SizeOfBlock</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">paddedBlockBytes</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">remainingByteCount</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #4EC9B0">UInt64</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">lastPlainPartBlock</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">BitConverter</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">ToUInt64</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">paddedBlockBytes</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #6A9955">                    //cipher block chaining</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">lastPlainPartBlock</span><span style="color: #D4D4D4"> ^= </span><span style="color: #9CDCFE">lastCipherFullBlock</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #6A9955">                    //steal bytes blockSize - remainingByteCount</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #4EC9B0">UInt64</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">mask</span><span style="color: #D4D4D4"> = (</span><span style="color: #B5CEA8">0xFFFFFFFFFFFFFFFF</span><span style="color: #D4D4D4"> &lt;&lt; </span><span style="color: #9CDCFE">remainingByteCount</span><span style="color: #D4D4D4"> * </span><span style="color: #B5CEA8">8</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">lastPlainPartBlock</span><span style="color: #D4D4D4"> |= </span><span style="color: #9CDCFE">lastCipherFullBlock</span><span style="color: #D4D4D4"> &amp; </span><span style="color: #9CDCFE">mask</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #4EC9B0">UInt64</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">lastCipherPartBlock</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">EncryptBlock</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">lastPlainPartBlock</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">                    //copy blocks to cipher output</span></span>
<span class="line"><span style="color: #6A9955">                    //block order is swapped</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #569CD6">byte</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">cipherBlockBytes</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #6A9955">                    //copy extended last part block </span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">cipherBlockBytes</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">BitConverter</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetBytes</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">lastCipherPartBlock</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #9CDCFE">c_SizeOfBlock</span><span style="color: #D4D4D4">; ++</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                        </span><span style="color: #9CDCFE">output</span><span style="color: #D4D4D4">&#91;(</span><span style="color: #9CDCFE">totalBlockCount</span><span style="color: #D4D4D4"> - </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">) * </span><span style="color: #9CDCFE">c_SizeOfBlock</span><span style="color: #D4D4D4"> + </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">&#93; = </span><span style="color: #9CDCFE">cipherBlockBytes</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">&#93;;</span></span>
<span class="line"><span style="color: #6A9955">                    //copy truncated last full block</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">cipherBlockBytes</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">BitConverter</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetBytes</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">lastCipherFullBlock</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #9CDCFE">remainingByteCount</span><span style="color: #D4D4D4">; ++</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                        </span><span style="color: #9CDCFE">output</span><span style="color: #D4D4D4">&#91;(</span><span style="color: #9CDCFE">totalBlockCount</span><span style="color: #D4D4D4"> - </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">) * </span><span style="color: #9CDCFE">c_SizeOfBlock</span><span style="color: #D4D4D4"> + </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">&#93; = </span><span style="color: #9CDCFE">cipherBlockBytes</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">&#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">                }</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">else</span></span>
<span class="line"><span style="color: #D4D4D4">                {</span></span>
<span class="line"><span style="color: #6A9955">                    //last full block</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #4EC9B0">UInt64</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">lastCipherFullBlock</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">BitConverter</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">ToUInt64</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">offset</span><span style="color: #D4D4D4"> + </span><span style="color: #9CDCFE">blockNo</span><span style="color: #D4D4D4"> * </span><span style="color: #9CDCFE">c_SizeOfBlock</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #4EC9B0">UInt64</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">lastPlainFullBlock</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">DecryptBlock</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">lastCipherFullBlock</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">                    //last part block</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">blockNo</span><span style="color: #D4D4D4">++;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #569CD6">byte</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">paddedBlockBytes</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">byte</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">c_SizeOfBlock</span><span style="color: #D4D4D4">&#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #9CDCFE">remainingByteCount</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">++)</span></span>
<span class="line"><span style="color: #D4D4D4">                        </span><span style="color: #9CDCFE">paddedBlockBytes</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">&#93; = </span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">offset</span><span style="color: #D4D4D4"> + </span><span style="color: #9CDCFE">blockNo</span><span style="color: #D4D4D4"> * </span><span style="color: #9CDCFE">c_SizeOfBlock</span><span style="color: #D4D4D4"> + </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">&#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #4EC9B0">UInt64</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">lastCipherPartBlock</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">BitConverter</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">ToUInt64</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">paddedBlockBytes</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #6A9955">                    //steal bytes blockSize - remainingByteCount</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #4EC9B0">UInt64</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">mask</span><span style="color: #D4D4D4"> = (</span><span style="color: #B5CEA8">0xFFFFFFFFFFFFFFFF</span><span style="color: #D4D4D4"> &lt;&lt; </span><span style="color: #9CDCFE">remainingByteCount</span><span style="color: #D4D4D4"> * </span><span style="color: #B5CEA8">8</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">lastCipherPartBlock</span><span style="color: #D4D4D4"> |= </span><span style="color: #9CDCFE">lastPlainFullBlock</span><span style="color: #D4D4D4"> &amp; </span><span style="color: #9CDCFE">mask</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #4EC9B0">UInt64</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">lastPlainPartBlock</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">DecryptBlock</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">lastCipherPartBlock</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #6A9955">                    //cipher block chaining</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">lastPlainPartBlock</span><span style="color: #D4D4D4"> ^= </span><span style="color: #9CDCFE">previousCipherBlock</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">                    //cipher block chaining</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">lastPlainFullBlock</span><span style="color: #D4D4D4"> ^= </span><span style="color: #9CDCFE">lastCipherPartBlock</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">                    //copy blocks to cipher output</span></span>
<span class="line"><span style="color: #6A9955">                    //block order is swapped</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #569CD6">byte</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">plainBlockBytes</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #6A9955">                    //copy extended last part block </span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">plainBlockBytes</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">BitConverter</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetBytes</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">lastPlainPartBlock</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">Array</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Copy</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">plainBlockBytes</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">output</span><span style="color: #D4D4D4">, (</span><span style="color: #9CDCFE">totalBlockCount</span><span style="color: #D4D4D4"> - </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">) * </span><span style="color: #9CDCFE">c_SizeOfBlock</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">plainBlockBytes</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Length</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #6A9955">                    //copy truncated last full block</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #9CDCFE">plainBlockBytes</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">BitConverter</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetBytes</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">lastPlainFullBlock</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #9CDCFE">remainingByteCount</span><span style="color: #D4D4D4">; ++</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                        </span><span style="color: #9CDCFE">output</span><span style="color: #D4D4D4">&#91;(</span><span style="color: #9CDCFE">totalBlockCount</span><span style="color: #D4D4D4"> - </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">) * </span><span style="color: #9CDCFE">c_SizeOfBlock</span><span style="color: #D4D4D4"> + </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">&#93; = </span><span style="color: #9CDCFE">plainBlockBytes</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">&#93;;</span></span>
<span class="line"><span style="color: #D4D4D4">                }</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">output</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">UInt64</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">EncryptBlock</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">UInt64</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">block</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">uint</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4"> = (</span><span style="color: #569CD6">uint</span><span style="color: #D4D4D4">)</span><span style="color: #9CDCFE">block</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">uint</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">z</span><span style="color: #D4D4D4"> = (</span><span style="color: #569CD6">uint</span><span style="color: #D4D4D4">)(</span><span style="color: #9CDCFE">block</span><span style="color: #D4D4D4"> &gt;&gt; </span><span style="color: #B5CEA8">32</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">uint</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sum</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">uint</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">n</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">c_RoundCount</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">while</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">n</span><span style="color: #D4D4D4">-- &gt; </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">            {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4"> += ((</span><span style="color: #9CDCFE">z</span><span style="color: #D4D4D4"> &lt;&lt; </span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4"> ^ </span><span style="color: #9CDCFE">z</span><span style="color: #D4D4D4"> &gt;&gt; </span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4">) + </span><span style="color: #9CDCFE">z</span><span style="color: #D4D4D4">) ^ (</span><span style="color: #9CDCFE">sum</span><span style="color: #D4D4D4"> + </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">subKeys</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">sum</span><span style="color: #D4D4D4"> &amp; </span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">sum</span><span style="color: #D4D4D4"> += </span><span style="color: #9CDCFE">c_Delta</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">z</span><span style="color: #D4D4D4"> += ((</span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4"> &lt;&lt; </span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4"> ^ </span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4"> &gt;&gt; </span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4">) + </span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4">) ^ (</span><span style="color: #9CDCFE">sum</span><span style="color: #D4D4D4"> + </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">subKeys</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">sum</span><span style="color: #D4D4D4"> &gt;&gt; </span><span style="color: #B5CEA8">11</span><span style="color: #D4D4D4"> &amp; </span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span><span style="color: #4EC9B0">UInt64</span><span style="color: #D4D4D4">)</span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4"> | (</span><span style="color: #4EC9B0">UInt64</span><span style="color: #D4D4D4">)</span><span style="color: #9CDCFE">z</span><span style="color: #D4D4D4"> &lt;&lt; </span><span style="color: #B5CEA8">32</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">UInt64</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">DecryptBlock</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">UInt64</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">block</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">uint</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4"> = (</span><span style="color: #569CD6">uint</span><span style="color: #D4D4D4">)</span><span style="color: #9CDCFE">block</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">uint</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">z</span><span style="color: #D4D4D4"> = (</span><span style="color: #569CD6">uint</span><span style="color: #D4D4D4">)(</span><span style="color: #9CDCFE">block</span><span style="color: #D4D4D4"> &gt;&gt; </span><span style="color: #B5CEA8">32</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">uint</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">sum</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">unchecked</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">c_Delta</span><span style="color: #D4D4D4"> * </span><span style="color: #9CDCFE">c_RoundCount</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">uint</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">n</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">c_RoundCount</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">while</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">n</span><span style="color: #D4D4D4">-- &gt; </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">            {</span></span>
<span class="line"><span style="color: #6A9955">                //y += ((z &lt;&lt; 4 ^ z &gt;&gt; 5) + z) ^ (sum + this.binKey&#91;sum &amp; 3&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">z</span><span style="color: #D4D4D4"> -= ((</span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4"> &lt;&lt; </span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4"> ^ </span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4"> &gt;&gt; </span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4">) + </span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4">) ^ (</span><span style="color: #9CDCFE">sum</span><span style="color: #D4D4D4"> + </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">subKeys</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">sum</span><span style="color: #D4D4D4"> &gt;&gt; </span><span style="color: #B5CEA8">11</span><span style="color: #D4D4D4"> &amp; </span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">sum</span><span style="color: #D4D4D4"> -= </span><span style="color: #9CDCFE">c_Delta</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #6A9955">                //z += ((y &lt;&lt; 4 ^ y &gt;&gt; 5) + y) ^ (sum + this.binKey&#91;sum &gt;&gt; 11 &amp; 3&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4"> -= ((</span><span style="color: #9CDCFE">z</span><span style="color: #D4D4D4"> &lt;&lt; </span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4"> ^ </span><span style="color: #9CDCFE">z</span><span style="color: #D4D4D4"> &gt;&gt; </span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4">) + </span><span style="color: #9CDCFE">z</span><span style="color: #D4D4D4">) ^ (</span><span style="color: #9CDCFE">sum</span><span style="color: #D4D4D4"> + </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">subKeys</span><span style="color: #D4D4D4">&#91;</span><span style="color: #9CDCFE">sum</span><span style="color: #D4D4D4"> &amp; </span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">&#93;);</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> (</span><span style="color: #4EC9B0">UInt64</span><span style="color: #D4D4D4">)</span><span style="color: #9CDCFE">y</span><span style="color: #D4D4D4"> | (</span><span style="color: #4EC9B0">UInt64</span><span style="color: #D4D4D4">)</span><span style="color: #9CDCFE">z</span><span style="color: #D4D4D4"> &lt;&lt; </span><span style="color: #B5CEA8">32</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><a href="https://static.dmcinfo.com/wp-content/uploads/2025/06/Key_TinyEncryptionAlgorithm.zip" target="_blank" rel="noreferrer noopener">Download the Microsoft.SPOT.Cryptography&#8217;s Key_TinyEncryptionAlgorithm Class</a></p>
<p>The post <a href="https://static.dmcinfo.com/blog/30218/encryption-compatibility-between-net-micro-framework-and-the-full-net-framework/">Encryption Compatibility Between .NET Micro Framework and the Full .NET Framework</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>DMC is a Windows Embedded Partner</title>
		<link>https://static.dmcinfo.com/blog/30258/dmc-is-a-windows-embedded-partner/</link>
		
		<dc:creator><![CDATA[DMC]]></dc:creator>
		<pubDate>Tue, 28 Jul 2009 08:56:46 +0000</pubDate>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[Embedded Development & Programming]]></category>
		<category><![CDATA[.NET Micro Framework]]></category>
		<category><![CDATA[GHI Embedded Master and EMX]]></category>
		<category><![CDATA[MS Visual Studio/.NET]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/30258/dmc-is-a-windows-embedded-partner/</guid>

					<description><![CDATA[<p>We are happy to announce that DMC has become a Windows Embedded Partner. DMC has been an active partner with Microsoft, joining the Microsoft Partner Program in 2001 and achieving Gold Partner status in 2007. Our Windows Embedded Partner status reflects our familiarity with Windows Embedded platforms, included Windows Embedded operating systems and the Microsoft [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/30258/dmc-is-a-windows-embedded-partner/">DMC is a Windows Embedded Partner</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">We are happy to announce that DMC has become a Windows Embedded Partner. DMC has been an active partner with Microsoft, joining the Microsoft Partner Program in 2001 and achieving Gold Partner status in 2007.</p>



<p class="wp-block-paragraph">Our Windows Embedded Partner status reflects our familiarity with Windows Embedded platforms, included Windows Embedded operating systems and the Microsoft .NET Micro Framework. Due to DMC&#8217;s experience and expertise with the <a href="http://www.microsoft.com/visualstudio/" target="_blank">Microsoft Visual Studio .NET</a> development environment, using the .NET Micro Framework (a scaled down embedded version of the .NET environment) for embedded development makes sense for DMC.</p>



<p class="wp-block-paragraph"><a href="https://static.dmcinfo.com/blog/30286/net-micro-framework-and-the-ghi-embedded-master/">Read more about DMC and the .NET Micro Framework</a>.</p>



<p class="wp-block-paragraph"><a href="/services/embedded-development-and-embedded-programming">Learn more about DMC&#8217;s embedded capabilities</a>.</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://static.dmcinfo.com/blog/30258/dmc-is-a-windows-embedded-partner/">DMC is a Windows Embedded Partner</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>.NET Micro Framework and the GHI Embedded Master</title>
		<link>https://static.dmcinfo.com/blog/30286/net-micro-framework-and-the-ghi-embedded-master/</link>
		
		<dc:creator><![CDATA[Dan Freve]]></dc:creator>
		<pubDate>Fri, 10 Jul 2009 12:00:44 +0000</pubDate>
				<category><![CDATA[Embedded Development & Programming]]></category>
		<category><![CDATA[.NET Micro Framework]]></category>
		<category><![CDATA[GHI Embedded Master and EMX]]></category>
		<category><![CDATA[MS Visual Studio/.NET]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/30286/net-micro-framework-and-the-ghi-embedded-master/</guid>

					<description><![CDATA[<p>Recently I&#8217;ve had the opportunity to do some embedded development using the .NET Micro Framework platform. The .NET Micro Framework is a light-weight version of the full .NET framework that can be ported to run on a variety of processors, including the ARM and Blackfin architectures. Using the .NET Framework, developers can implement their solutions [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/30286/net-micro-framework-and-the-ghi-embedded-master/">.NET Micro Framework and the GHI Embedded Master</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Recently I&#8217;ve had the opportunity to do some embedded development using the <a href="https://en.wikipedia.org/wiki/.NET_Micro_Framework" target="_blank" rel="noreferrer noopener">.NET Micro Framework</a> platform. The .NET Micro Framework is a light-weight version of the full .NET framework that can be ported to run on a variety of processors, including the ARM and Blackfin architectures.</p>



<p class="wp-block-paragraph">Using the .NET Framework, developers can implement their solutions in C#. While developing an embedded program in a managed language may sound foreign to most engineers, the obvious benefits are rapid development and the hands-off convenience of <a href="http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)" target="_blank">garbage collection</a>.</p>



<p class="wp-block-paragraph">Several vendors have ported the framework on their hardware, and have added many useful capabilities to those already present in the framework. The processor I&#8217;ve been working with is the Embedded Master by GHI Electronics. So far, I&#8217;ve been very impressed with how easy it is to quickly implement &#8220;Hello World&#8221; applications to test some of GHI&#8217;s features, including:</p>



<ul class="wp-block-list">
<li>Serial Communication (I2C, SPI, RS232, One-wire)</li>



<li>USB Host and Device</li>



<li>FAT file system</li>



<li>TCP/IP</li>



<li>PPP (Point to Point Protocol)</li>



<li>PWM</li>
</ul>



<p class="wp-block-paragraph">Expect several posts soon highlighting some tips and tricks of working with the Embedded Master and the .NET Micro Framework.</p>



<p class="wp-block-paragraph"><strong><a href="/services/embedded-development-and-embedded-programming">Learn more about DMC&#8217;s embedded development and embedded programming services.</a></strong></p>
<p>The post <a href="https://static.dmcinfo.com/blog/30286/net-micro-framework-and-the-ghi-embedded-master/">.NET Micro Framework and the GHI Embedded Master</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
