<p>一个由<strong><em>n</em></strong>位组成的数字(我们称之为<strong><em>n</em></strong>)写为:</p>
<p><strong><em>D<sub>n-1</sub>D<sub>n-2</sub>D<sub>n-3</sub>…D<sub>2</sub>D<sub>1</sub>0</sub></em>(其中每个<em>D<sub>i</sub></em>都是基数<em>B</em>中的一个数字)</p>
<p>其值可根据以下公式计算:</p>
<p><strong>V<sub>X</sub>=σ<sub>i</sub><sup>n</sup><sub>=</sub><sup>-</sup><sub>0</sub><sup>1</sup>(B<sup>i</sup>*D<sub>i</sub>)</strong>(注意,在本例中,数字是从右向左遍历的</em>——遍历感不影响最终值)。在</p>
<p>例如,number<strong><em>2468(B<sub>10</sub>)=10<sup>0</sup>*8+10<sup>1</sup>*6+10<sup>2</sup>*4+10<sup>3</sup>*2</em>(<em>=8+60+400+2000</em>)。在</p>
<p>ASCII</em>字符串实际上是一个基数<em>256</em>(<em>0x100</em>)</strong>的数字,其中每个字符(字节)都是一个数字。在</p>
<p>以下是基于上述情况的另一种选择:</p>
<ul>
<li>它只对整数执行数学运算(转换为字符串只在最后完成)</li>
<li>遍历意义(从上)有助于限制(最终(十进制)数字必须适合多个数字,并且在溢出的情况下,<strong>最有效的数字将被忽略</strong>)</li>
<li>算法很简单,从右边开始,计算部分数值,直到达到允许的最大值,或者耗尽数字位数(字符串字符)</li>
</ul>
<p><em>代码.py</em>:</p>
<pre class="lang-py prettyprint-override"><code>#!/usr/bin/env python
import sys
DEFAULT_MAX_DIGITS = 10
def convert(array, max_digits=DEFAULT_MAX_DIGITS):
max_val = 10 ** max_digits
number_val = 0
for idx, digit in enumerate(reversed(array)):
cur_val = 256 ** idx * digit
if number_val + cur_val > max_val:
break
number_val += cur_val
return str(number_val).zfill(max_digits)
def main():
b = bytearray("4\x00/\t\xb5")
print("b: {:}\n".format(repr(b)))
for max_digits in range(6, 15, 2):
print("Conversion of b (with max {:02d} digits): {:}{:s}".format(
max_digits, convert(b, max_digits=max_digits),
" (!!! Default case - required in the question)" if max_digits == DEFAULT_MAX_DIGITS else ""
))
if __name__ == "__main__":
print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
main()
</code></pre>
<p><strong>输出</strong>:</p>
<blockquote>
<pre><code>(py_064_02.07.15_test0) e:\Work\Dev\StackOverflow\q054091895>"e:\Work\Dev\VEnvs\py_064_02.07.15_test0\Scripts\python.exe" code.py
Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)] on win32
b: bytearray(b'4\x00/\t\xb5')
Conversion of b (with max 06 digits): 002485
Conversion of b (with max 08 digits): 03082677
Conversion of b (with max 10 digits): 0003082677 (!!! Default case - required in the question)
Conversion of b (with max 12 digits): 223341382069
Conversion of b (with max 14 digits): 00223341382069
</code></pre>
</blockquote>