Python bitstring uint看起来很长

时间:2014-09-13 12:17:18

标签: python uint

python很新,似乎卡住了,我有以下几点:

我从比特流中读取了30位:

MMSI = b.readlist('uint:30')

这似乎正常工作,除非值越来越高。

MMSI = b.readlist('uint:30')
p = 972128254
# repr(MMSI)[:-1]
print p
print "MMSI :"
print MMSI
if MMSI == p:

上面的代码输出:

972128254
MMSI :
[972128254L]

如果MMSI == p:被跳过,则由于某种原因它不相等。 我不明白为什么这个值远远低于max.int:

>>> import sys
>>> sys.maxint
2147483647

我不明白为什么我得到一个Long而不是一个uint? 如果返回的值是244123456,那就像魅力一样。

我在这里缺少什么?

感谢advange,

粗暴

3 个答案:

答案 0 :(得分:1)

2147483647是maxint,但int是32位,你使用30位。所以你的最大值是1/4,或大约5亿。

答案 1 :(得分:1)

如果中间值为long,则值将为“long”。例如,2**1000 / 2**999将等于2L。这与您调用的方法的内部情况有关,不应影响大多数代码。

真正的问题是你的代码中的比较是将int与列表进行比较,这不是你想要做的。您可以使用read方法而不是readlist来返回单个项目,也可以使用返回列表的第一个元素:if MMSI[0] == p:

答案 2 :(得分:0)

啊哈,我想如果我读取30位并将其作为uint值返回,它将自动为32位值。 所以你要说的是我必须添加前导零以产生32位值然后它应该工作。 这就是我测试过的,现在我迷失了。

我想我们可以用同样的方式编码我想要比较的值。所以这就是我所做的:

  from bitarray import bitarray
  from bitstring import BitArray, BitStream,pack
  from time import sleep
  import string

  MMSI = b.readlist('uint:30')
  x = pack('uint:30',972000000)
  p = x.readlist('uint:30')
  y = pack('uint:30',972999999)
  q = y.read('uint:30')
  print p
  print q
  print x
  print y
  print MMSI

导致:

 p = [972000000L]
 q = 972999999
 x = 0b111001111011111000101100000000
 y = 0b111001111111101100110100111111
 MMSI = [972128254L]

如何更高的值972999999不长?