1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2<html> 3<head> 4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5<title>Augmented-CRC Function</title> 6<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css"> 7<meta name="generator" content="DocBook XSL Stylesheets V1.79.1"> 8<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset"> 9<link rel="up" href="../crc.html" title="Chapter 12. Boost.CRC 1.5"> 10<link rel="prev" href="crc_function.html" title="CRC Function"> 11<link rel="next" href="crc_samples.html" title="Pre-Defined CRC Samples"> 12</head> 13<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> 14<table cellpadding="2" width="100%"><tr> 15<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td> 16<td align="center"><a href="../../../index.html">Home</a></td> 17<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td> 18<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> 19<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> 20<td align="center"><a href="../../../more/index.htm">More</a></td> 21</tr></table> 22<hr> 23<div class="spirit-nav"> 24<a accesskey="p" href="crc_function.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../crc.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="crc_samples.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> 25</div> 26<div class="section"> 27<div class="titlepage"><div><div><h2 class="title" style="clear: both"> 28<a name="crc.acrc_function"></a><a class="link" href="acrc_function.html" title="Augmented-CRC Function">Augmented-CRC Function</a> 29</h2></div></div></div> 30<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">cstdint</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// for boost::uintmax_t</span> 31<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">integer</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> <span class="comment">// for boost::uint_t</span> 32<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cstddef</span><span class="special">></span> <span class="comment">// for std::size_t</span> 33 34<span class="keyword">namespace</span> <span class="identifier">boost</span> 35<span class="special">{</span> 36 <span class="keyword">template</span> <span class="special"><</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">Bits</span><span class="special">,</span> <span class="identifier">uintmax_t</span> <span class="identifier">TruncPoly</span> <span class="special">></span> 37 <span class="keyword">typename</span> <span class="identifier">uint_t</span><span class="special"><</span><span class="identifier">Bits</span><span class="special">>::</span><span class="identifier">fast</span> <span class="identifier">augmented_crc</span><span class="special">(</span> <span class="keyword">void</span> <span class="keyword">const</span> <span class="special">*</span><span class="identifier">buffer</span><span class="special">,</span> 38 <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">byte_count</span><span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">uint_t</span><span class="special"><</span><span class="identifier">Bits</span><span class="special">>::</span><span class="identifier">fast</span> <span class="identifier">initial_remainder</span> 39 <span class="special">=</span> <span class="number">0u</span> <span class="special">);</span> 40<span class="special">}</span> 41</pre> 42<p> 43 The <span class="bold"><strong><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">augmented_crc</span></code></strong></span> 44 function computes the augmented-style CRC of a data block. Like <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">crc</span></code>, 45 the first two template parameters are the <span class="emphasis"><em>WIDTH</em></span> and <span class="emphasis"><em>POLY</em></span>. 46 However, the <span class="emphasis"><em>INIT</em></span> has moved to being a function parameter, 47 after the data block's starting address and byte length, defaulting to zero 48 if not given. 49 </p> 50<p> 51 This function uses modulo-2 division at its most raw, and so forfeits the 52 <span class="emphasis"><em>REFIN</em></span>, <span class="emphasis"><em>REFOUT</em></span>, and <span class="emphasis"><em>XOROUT</em></span> 53 attributes, setting them to <code class="computeroutput"><span class="number">0</span></code> or 54 <code class="computeroutput"><span class="keyword">false</span></code>. Another difference from 55 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">crc</span></code> is that a non-zero <span class="emphasis"><em>INIT</em></span> 56 has to be skewed when used with this function. (No conversion functions are 57 currently given.) 58 </p> 59<p> 60 The <code class="computeroutput"><span class="identifier">augmented_crc</span></code> function 61 can compute CRCs from distributed data, too: 62 </p> 63<p> 64</p> 65<pre class="programlisting"><span class="keyword">unsigned</span> <span class="identifier">combined_acrc_16</span><span class="special">(</span> <span class="keyword">int</span> <span class="identifier">block_count</span><span class="special">,</span> <span class="special">...</span> <span class="special">)</span> 66<span class="special">{</span> 67 <a class="co" name="crc.acrc_function.c0" href="acrc_function.html#crc.acrc_function.c1"><img src="../../../doc/src/images/callouts/1.png" alt="1" border="0"></a><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span> 68 69 <span class="identifier">va_list</span> <span class="identifier">ap</span><span class="special">;</span> 70 <span class="keyword">unsigned</span> <span class="identifier">result</span> <span class="special">=</span> <span class="number">0u</span><span class="special">;</span> 71 72 <span class="identifier">va_start</span><span class="special">(</span> <span class="identifier">ap</span><span class="special">,</span> <span class="identifier">block_count</span> <span class="special">);</span> 73 <span class="keyword">if</span> <span class="special">(</span> <span class="identifier">block_count</span> <span class="special"><=</span> <span class="number">0</span> <span class="special">)</span> 74 <span class="keyword">goto</span> <span class="identifier">finish</span><span class="special">;</span> 75 76 <span class="keyword">void</span> <span class="keyword">const</span> <span class="special">*</span> <span class="identifier">bs</span> <span class="special">=</span> <span class="identifier">va_arg</span><span class="special">(</span> <span class="identifier">ap</span><span class="special">,</span> <span class="keyword">void</span> <span class="keyword">const</span> <span class="special">*</span> <span class="special">);</span> 77 <span class="identifier">size_t</span> <span class="identifier">bl</span> <span class="special">=</span> <span class="identifier">va_arg</span><span class="special">(</span> <span class="identifier">ap</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="special">);</span> 78 79 <a class="co" name="crc.acrc_function.c2" href="acrc_function.html#crc.acrc_function.c3"><img src="../../../doc/src/images/callouts/2.png" alt="2" border="0"></a><span class="identifier">result</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">augmented_crc</span><span class="special"><</span><span class="number">16</span><span class="special">,</span> <span class="number">0x1021u</span><span class="special">>(</span> <span class="identifier">bs</span><span class="special">,</span> <span class="identifier">bl</span> <span class="special">);</span> 80 <span class="keyword">while</span> <span class="special">(</span> <span class="special">--</span><span class="identifier">block_count</span> <span class="special">)</span> 81 <span class="special">{</span> 82 <span class="identifier">bs</span> <span class="special">=</span> <span class="identifier">va_arg</span><span class="special">(</span> <span class="identifier">ap</span><span class="special">,</span> <span class="keyword">void</span> <span class="keyword">const</span> <span class="special">*</span> <span class="special">);</span> 83 <span class="identifier">bl</span> <span class="special">=</span> <span class="identifier">va_arg</span><span class="special">(</span> <span class="identifier">ap</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="special">);</span> 84 <span class="identifier">result</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">augmented_crc</span><span class="special"><</span><span class="number">16</span><span class="special">,</span> <span class="number">0x1021u</span><span class="special">>(</span> <span class="identifier">bs</span><span class="special">,</span> <span class="identifier">bl</span><span class="special">,</span> <span class="identifier">result</span> <span class="special">);</span> 85 <span class="special">}</span> 86 87<span class="identifier">finish</span><span class="special">:</span> 88 <span class="identifier">va_end</span><span class="special">(</span> <span class="identifier">ap</span> <span class="special">);</span> 89 <span class="keyword">return</span> <span class="identifier">result</span><span class="special">;</span> 90<span class="special">}</span> 91</pre> 92<p> 93 </p> 94<p> 95 No CRC operation throws, so there is no need for extra protection between the 96 varargs macro calls. Feeding the result from the previous run as the initial 97 remainder for the next run works easily because there's no output reflection 98 or XOR mask. 99 </p> 100<div class="calloutlist"><table border="0" summary="Callout list"> 101<tr> 102<td width="5%" valign="top" align="left"><p><a name="crc.acrc_function.c1"></a><a href="#crc.acrc_function.c0"><img src="../../../doc/src/images/callouts/1.png" alt="1" border="0"></a> </p></td> 103<td valign="top" align="left"><p> 104 C-style variable-argument routines are or may be macros. 105 </p></td> 106</tr> 107<tr> 108<td width="5%" valign="top" align="left"><p><a name="crc.acrc_function.c3"></a><a href="#crc.acrc_function.c2"><img src="../../../doc/src/images/callouts/2.png" alt="2" border="0"></a> </p></td> 109<td valign="top" align="left"><p> 110 The parameters are based on <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">crc_xmodem_t</span></code>. 111 </p></td> 112</tr> 113</table></div> 114<p> 115 Since <code class="computeroutput"><span class="identifier">augmented_crc</span></code> doesn't 116 know when your data ends, you must supply the augment, either <span class="emphasis"><em>WIDTH</em></span> 117 zero bits or the expected checksum. The augment can be either at the end of 118 last data block or from an extra call. Remember that if an expected checksum 119 is used as the augment, its bits must be arranged in big-endian order. Because 120 <code class="computeroutput"><span class="identifier">augmented_crc</span></code> reads byte-wise, 121 while augments assume bit-wise reading, augmentations are valid only when 122 <span class="emphasis"><em>WIDTH</em></span> is a multiple of the bits-per-byte ratio (<code class="computeroutput"><span class="identifier">CHAR_BIT</span></code>). 123 </p> 124</div> 125<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 126<td align="left"></td> 127<td align="right"><div class="copyright-footer">Copyright © 2001, 2003, 2012 Daryle Walker<p> 128 Distributed under the Boost Software License, Version 1.0. (See the accompanying 129 file LICENSE_1_0.txt or a copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) 130 </p> 131</div></td> 132</tr></table> 133<hr> 134<div class="spirit-nav"> 135<a accesskey="p" href="crc_function.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../crc.html"><img src="../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="crc_samples.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> 136</div> 137</body> 138</html> 139