<p>你的问题有不同的问题。</p>
<h2>C部分:</h2>
<p>您使用的key值是64位值(<code>0x0f0f0f0f0f123456</code>),但输出显示编译器的unsigned long只有32位宽。所以C代码所做的是旋转32位值<code>0x0f123456</code>16次,得到<code>0x34560f12</code></p>
<p>如果您使用了<code>unsigned long long</code>(假设它在您的体系结构上是64位的,就像在我的体系结构上一样),那么您将得到<code>0x34560f0f0f0f0f12</code>(64位的16次旋转)</p>
<h2>Python部分:</h2>
<p>mask1和ror之间的宽度定义不一致。<code>mask1</code>以位为单位获取宽度,其中ror以字节为单位获取宽度,一个字节=8位。</p>
<p><code>ror</code>函数应该是:</p>
<pre><code>def ror(n, rotations=1, width=8):
"""Return a given number of bitwise right rotations of an integer n,
for a given bit field width.
"""
rotations %= width * 8 # width bytes give 8*bytes bits
if rotations < 1:
return n
mask = mask1(8 * width) # store the mask
n &= mask
return (n >> rotations) | ((n << (8 * width - rotations)) & mask) # apply the mask to result
</code></pre>
<p>这样使用<code>key = 0x0f0f0f0f0f123456</code>,您将得到:</p>
<pre class="lang-none prettyprint-override"><code>>>> hex(ror(key, 16))
'0x34560f0f0f0f0f12L'
>>> hex(ror(key, 16, 4))
'0x34560f12L'
</code></pre>
<p>与C输出完全相同</p>