擅长:python、mysql、java
<p>BCD码每一个数字有4位,通常只编码0-9位。所以序列中的每个字节包含2个数字,每4位信息中有1个。</p>
<p>以下方法使用生成器生成这些数字;我假设0xF值表示没有更多的数字可遵循:</p>
<pre><code>def bcdDigits(chars):
for char in chars:
char = ord(char)
for val in (char >> 4, char & 0xF):
if val == 0xF:
return
yield val
</code></pre>
<p>在这里,我使用<a href="http://docs.python.org/reference/expressions.html#shifting-operations" rel="noreferrer">right-shift operator</a>将最左边的4位移到右边,使用<a href="http://docs.python.org/reference/expressions.html#shifting-opera" rel="noreferrer">bitwise AND</a>只选择最右边的4位。</p>
<p>演示:</p>
<pre><code>>>> characters = ('3', '\x00', '\x02', '\x05', '\x15', '\x13', 'G', 'O', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff')
>>> list(bcdDigits(characters))
[3, 3, 0, 0, 0, 2, 0, 5, 1, 5, 1, 3, 4, 7, 4]
</code></pre>
<p>该方法与<code>c</code>输出一起工作;如果直接传递整数(但改用<code>B</code>无符号变量),则可以跳过该方法中的<code>ord</code>调用。或者,您可以直接从文件中读取这16个字节,并将此函数直接应用于这些字节,而不使用struct。</p>