0

我使用该库bitarray来管理我的位转换并用 Python 编写二进制文件。写入文件之前的 bitarray.to01() 是 length 4807100171。出于某种原因,我无法理解,在从文件 ( b.fromfile(file)) 获取位然后用 转换为 0 和1 的字符串之后,to01()我的字符串 () 中不仅有 0 和 1,\x00然后,当我使用它时,我得到这个错误:

ValueError: invalid literal for int() with base 2: '0000000000000000\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

我想知道来自文件的字符串是否有大小限制或某些问题。如果是这样,我还没有找到任何关于它的东西......

编辑:

这是重现问题的一种方法:

import re
from bitarray import bitarray 

b = bitarray(4807100171)
b.setall(False) 

if re.match("^[\d]+$", b.to01()):
    print "there is only digits in this string."
else:
    print "there is not only digits in this string."

** 编辑#2:

但是,如果我使用platform.architecture()and检查我的机器sys.maxint,我会得到:

In [1]: import platform, sys
In [5]: platform.architecture(), sys.maxint
Out[5]: (('64bit', ''), 9223372036854775807)

所以,这大约是 2^63。为什么它会在 2^32 处截断?我有 4GB 的内存。我得到了 2^32*1.16415e-10*8 (因为我将它转换为字符串)~= 4GB ......但是这是一台 64 位机器的事实呢?

4

1 回答 1

1

您的机器上没有内存来在to01该大小的位数组上运行该方法。该字符串将使用每个数字一个字节(至少) - 你有超过 2**32 位数字。由于您不是swappign或内存不足错误,您可能在bitarray中遇到了一些错误——但是......退后一步!

为什么你会想要一个由“0”和“1”组成的 40 亿位数字字符串?为自己打印一个以 Matrix 为主题的赛道??

如果您需要将几十万位数字转换为 0s 和 1s ,以寻找某种模式,或者其他什么,您最好以交互方式进行,一次转换几个字节,而不是在那里尝试。

于 2012-10-17T15:24:52.607 回答