• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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">&lt;</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">&gt;</span>  <span class="comment">// for boost::uintmax_t</span>
31<span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</span>  <span class="comment">// for boost::uint_t</span>
32<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cstddef</span><span class="special">&gt;</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">&lt;</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">&gt;</span>
37    <span class="keyword">typename</span> <span class="identifier">uint_t</span><span class="special">&lt;</span><span class="identifier">Bits</span><span class="special">&gt;::</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">&lt;</span><span class="identifier">Bits</span><span class="special">&gt;::</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">&lt;=</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">&lt;</span><span class="number">16</span><span class="special">,</span> <span class="number">0x1021u</span><span class="special">&gt;(</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">&lt;</span><span class="number">16</span><span class="special">,</span> <span class="number">0x1021u</span><span class="special">&gt;(</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