⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 misc_8h-source.html

📁 Crypto++是一个非常强大的密码学库,主要是功能全
💻 HTML
📖 第 1 页 / 共 3 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"><title>Crypto++: misc.h Source File</title><link href="doxygen.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.3.2 --><div class="qindex"><a class="qindex" href="index.html">Main&nbsp;Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical&nbsp;List</a> | <a class="qindex" href="annotated.html">Compound&nbsp;List</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="namespacemembers.html">Namespace&nbsp;Members</a> | <a class="qindex" href="functions.html">Compound&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;Members</a></div><h1>misc.h</h1><div class="fragment"><pre>00001 <span class="preprocessor">#ifndef CRYPTOPP_MISC_H</span>00002 <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_MISC_H</span>00003 <span class="preprocessor"></span>00004 <span class="preprocessor">#include "<a class="code" href="cryptlib_8h.html">cryptlib.h</a>"</span>00005 00006 <span class="preprocessor">#ifdef INTEL_INTRINSICS</span>00007 <span class="preprocessor"></span><span class="preprocessor">#include &lt;stdlib.h&gt;</span>00008 <span class="preprocessor">#endif</span>00009 <span class="preprocessor"></span>00010 NAMESPACE_BEGIN(CryptoPP)00011 00012 <span class="comment">// ************** compile-time assertion ***************</span>00013 00014 <span class="keyword">template</span> &lt;<span class="keywordtype">bool</span> b&gt;00015 <span class="keyword">struct </span>CompileAssert00016 {00017         <span class="keyword">static</span> <span class="keywordtype">char</span> dummy[2*b-1];00018 };00019 00020 <span class="preprocessor">#define CRYPTOPP_COMPILE_ASSERT(assertion) CRYPTOPP_COMPILE_ASSERT_INSTANCE(assertion, __LINE__)</span>00021 <span class="preprocessor"></span><span class="preprocessor">#if defined(CRYPTOPP_EXPORTS) || defined(CRYPTOPP_IMPORTS)</span>00022 <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_COMPILE_ASSERT_INSTANCE(assertion, instance)</span>00023 <span class="preprocessor"></span><span class="preprocessor">#else</span>00024 <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_COMPILE_ASSERT_INSTANCE(assertion, instance) static CompileAssert&lt;(assertion)&gt; CRYPTOPP_ASSERT_JOIN(cryptopp_assert_, instance)</span>00025 <span class="preprocessor"></span><span class="preprocessor">#endif</span>00026 <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_ASSERT_JOIN(X, Y) CRYPTOPP_DO_ASSERT_JOIN(X, Y)</span>00027 <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_DO_ASSERT_JOIN(X, Y) X##Y</span>00028 <span class="preprocessor"></span>00029 <span class="comment">// ************** misc classes ***************</span>00030 00031 <span class="keyword">class </span>CRYPTOPP_DLL Empty00032 {00033 };00034 00035 <span class="keyword">template</span> &lt;<span class="keyword">class</span> BASE1, <span class="keyword">class</span> BASE2&gt;00036 <span class="keyword">class </span>TwoBases : <span class="keyword">public</span> BASE1, <span class="keyword">public</span> BASE200037 {00038 };00039 00040 <span class="keyword">template</span> &lt;<span class="keyword">class</span> BASE1, <span class="keyword">class</span> BASE2, <span class="keyword">class</span> BASE3&gt;00041 <span class="keyword">class </span>ThreeBases : <span class="keyword">public</span> BASE1, <span class="keyword">public</span> BASE2, <span class="keyword">public</span> BASE300042 {00043 };00044 00045 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;00046 <span class="keyword">class </span>ObjectHolder00047 {00048 <span class="keyword">protected</span>:00049         T m_object;00050 };00051 00052 <span class="keyword">class </span>NotCopyable00053 {00054 <span class="keyword">public</span>:00055         NotCopyable() {}00056 <span class="keyword">private</span>:00057     NotCopyable(<span class="keyword">const</span> NotCopyable &amp;);00058     <span class="keywordtype">void</span> operator=(<span class="keyword">const</span> NotCopyable &amp;);00059 };00060 00061 <span class="comment">// ************** misc functions ***************</span>00062 00063 <span class="comment">// can't use std::min or std::max in MSVC60 or Cygwin 1.1.0</span>00064 <span class="keyword">template</span> &lt;<span class="keyword">class</span> _Tp&gt; <span class="keyword">inline</span> <span class="keyword">const</span> _Tp&amp; STDMIN(<span class="keyword">const</span> _Tp&amp; __a, <span class="keyword">const</span> _Tp&amp; __b)00065 {00066         <span class="keywordflow">return</span> __b &lt; __a ? __b : __a;00067 }00068 00069 <span class="keyword">template</span> &lt;<span class="keyword">class</span> _Tp&gt; <span class="keyword">inline</span> <span class="keyword">const</span> _Tp&amp; STDMAX(<span class="keyword">const</span> _Tp&amp; __a, <span class="keyword">const</span> _Tp&amp; __b)00070 {00071         <span class="keywordflow">return</span>  __a &lt; __b ? __b : __a;00072 }00073 00074 <span class="preprocessor">#define RETURN_IF_NONZERO(x) unsigned int returnedValue = x; if (returnedValue) return returnedValue</span>00075 <span class="preprocessor"></span>00076 <span class="comment">// this version of the macro is fastest on Pentium 3 and Pentium 4 with MSVC 6 SP5 w/ Processor Pack</span>00077 <span class="preprocessor">#define GETBYTE(x, y) (unsigned int)byte((x)&gt;&gt;(8*(y)))</span>00078 <span class="preprocessor"></span><span class="comment">// these may be faster on other CPUs/compilers</span>00079 <span class="comment">// #define GETBYTE(x, y) (unsigned int)(((x)&gt;&gt;(8*(y)))&amp;255)</span>00080 <span class="comment">// #define GETBYTE(x, y) (((byte *)&amp;(x))[y])</span>00081 00082 CRYPTOPP_DLL <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Parity(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>);00083 CRYPTOPP_DLL <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BytePrecision(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>);00084 CRYPTOPP_DLL <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BitPrecision(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>);00085 CRYPTOPP_DLL <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> Crop(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size);00086 00087 <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BitsToBytes(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bitCount)00088 {00089         <span class="keywordflow">return</span> ((bitCount+7)/(8));00090 }00091 00092 <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BytesToWords(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> byteCount)00093 {00094         <span class="keywordflow">return</span> ((byteCount+WORD_SIZE-1)/WORD_SIZE);00095 }00096 00097 <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BitsToWords(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bitCount)00098 {00099         <span class="keywordflow">return</span> ((bitCount+WORD_BITS-1)/(WORD_BITS));00100 }00101 00102 CRYPTOPP_DLL <span class="keywordtype">void</span> xorbuf(byte *buf, <span class="keyword">const</span> byte *mask, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count);00103 CRYPTOPP_DLL <span class="keywordtype">void</span> xorbuf(byte *output, <span class="keyword">const</span> byte *input, <span class="keyword">const</span> byte *mask, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count);00104 00105 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;00106 <span class="keyword">inline</span> <span class="keywordtype">bool</span> IsPowerOf2(T n)00107 {00108         <span class="keywordflow">return</span> n &gt; 0 &amp;&amp; (n &amp; (n-1)) == 0;00109 }00110 00111 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T1, <span class="keyword">class</span> T2&gt;00112 <span class="keyword">inline</span> T2 ModPowerOf2(T1 a, T2 b)00113 {00114         assert(IsPowerOf2(b));00115         <span class="keywordflow">return</span> T2(a) &amp; (b-1);00116 }00117 00118 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;00119 <span class="keyword">inline</span> T RoundDownToMultipleOf(T n, T m)00120 {00121         <span class="keywordflow">return</span> n - (IsPowerOf2(m) ? ModPowerOf2(n, m) : (n%m));00122 }00123 00124 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;00125 <span class="keyword">inline</span> T RoundUpToMultipleOf(T n, T m)00126 {00127         <span class="keywordflow">return</span> RoundDownToMultipleOf(n+m-1, m);00128 }00129 00130 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;00131 <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> GetAlignment(T *dummy=NULL) <span class="comment">// VC60 workaround</span>00132 {00133 <span class="preprocessor">#if (_MSC_VER &gt;= 1300)</span>00134 <span class="preprocessor"></span>        <span class="keywordflow">return</span> __alignof(T);00135 <span class="preprocessor">#elif defined(__GNUC__)</span>00136 <span class="preprocessor"></span>        <span class="keywordflow">return</span> __alignof__(T);00137 <span class="preprocessor">#else</span>00138 <span class="preprocessor"></span>        <span class="keywordflow">return</span> <span class="keyword">sizeof</span>(T);00139 <span class="preprocessor">#endif</span>00140 <span class="preprocessor"></span>}00141 00142 <span class="keyword">inline</span> <span class="keywordtype">bool</span> IsAlignedOn(<span class="keyword">const</span> <span class="keywordtype">void</span> *p, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> alignment)00143 {00144         <span class="keywordflow">return</span> IsPowerOf2(alignment) ? ModPowerOf2((<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)p, alignment) == 0 : (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)p % alignment == 0;00145 }00146 00147 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;00148 <span class="keyword">inline</span> <span class="keywordtype">bool</span> IsAligned(<span class="keyword">const</span> <span class="keywordtype">void</span> *p, T *dummy=NULL)     <span class="comment">// VC60 workaround</span>00149 {00150         <span class="keywordflow">return</span> IsAlignedOn(p, GetAlignment&lt;T&gt;());00151 }00152 00153 <span class="preprocessor">#ifdef IS_LITTLE_ENDIAN</span>00154 <span class="preprocessor"></span>        <span class="keyword">typedef</span> LittleEndian NativeByteOrder;00155 <span class="preprocessor">#else</span>00156 <span class="preprocessor"></span>        <span class="keyword">typedef</span> BigEndian NativeByteOrder;00157 <span class="preprocessor">#endif</span>00158 <span class="preprocessor"></span>00159 <span class="keyword">inline</span> ByteOrder GetNativeByteOrder()00160 {00161         <span class="keywordflow">return</span> NativeByteOrder::ToEnum();00162 }00163 00164 <span class="keyword">inline</span> <span class="keywordtype">bool</span> NativeByteOrderIs(ByteOrder order)00165 {00166         <span class="keywordflow">return</span> order == GetNativeByteOrder();00167 }00168 00169 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;              <span class="comment">// can't use &lt;sstream&gt; because GCC 2.95.2 doesn't have it</span>00170 std::string IntToString(T a, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> base = 10)00171 {00172         <span class="keywordflow">if</span> (a == 0)00173                 <span class="keywordflow">return</span> <span class="stringliteral">"0"</span>;00174         <span class="keywordtype">bool</span> negate = <span class="keyword">false</span>;00175         <span class="keywordflow">if</span> (a &lt; 0)00176         {00177                 negate = <span class="keyword">true</span>;00178                 a = 0-a;        <span class="comment">// VC .NET does not like -a</span>00179         }00180         std::string result;00181         <span class="keywordflow">while</span> (a &gt; 0)00182         {00183                 T digit = a % base;00184                 result = char((digit &lt; 10 ? <span class="charliteral">'0'</span> : (<span class="charliteral">'a'</span> - 10)) + digit) + result;00185                 a /= base;00186         }00187         <span class="keywordflow">if</span> (negate)00188                 result = <span class="stringliteral">"-"</span> + result;00189         <span class="keywordflow">return</span> result;00190 }00191 00192 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T1, <span class="keyword">class</span> T2&gt;00193 <span class="keyword">inline</span> T1 SaturatingSubtract(T1 a, T2 b)00194 {00195         CRYPTOPP_COMPILE_ASSERT_INSTANCE(T1(-1)&gt;0, 0);  <span class="comment">// T1 is unsigned type</span>00196         CRYPTOPP_COMPILE_ASSERT_INSTANCE(T2(-1)&gt;0, 1);  <span class="comment">// T2 is unsigned type</span>00197         <span class="keywordflow">return</span> T1((a &gt; b) ? (a - b) : 0);00198 }00199 00200 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;00201 <span class="keyword">inline</span> <a class="code" href="cryptlib_8h.html#a11">CipherDir</a> GetCipherDir(<span class="keyword">const</span> T &amp;obj)00202 {00203         <span class="keywordflow">return</span> obj.IsForwardTransformation() ? ENCRYPTION : DECRYPTION;00204 }00205 00206 <span class="comment">// ************** rotate functions ***************</span>00207 00208 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <span class="keyword">inline</span> T rotlFixed(T x, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> y)00209 {00210         assert(y &lt; <span class="keyword">sizeof</span>(T)*8);00211         <span class="keywordflow">return</span> (x&lt;&lt;y) | (x&gt;&gt;(<span class="keyword">sizeof</span>(T)*8-y));00212 }00213 00214 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <span class="keyword">inline</span> T rotrFixed(T x, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> y)00215 {00216         assert(y &lt; <span class="keyword">sizeof</span>(T)*8);00217         <span class="keywordflow">return</span> (x&gt;&gt;y) | (x&lt;&lt;(<span class="keyword">sizeof</span>(T)*8-y));00218 }00219 00220 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <span class="keyword">inline</span> T rotlVariable(T x, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> y)00221 {00222         assert(y &lt; <span class="keyword">sizeof</span>(T)*8);00223         <span class="keywordflow">return</span> (x&lt;&lt;y) | (x&gt;&gt;(<span class="keyword">sizeof</span>(T)*8-y));00224 }00225 00226 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <span class="keyword">inline</span> T rotrVariable(T x, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> y)00227 {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -