1

我有以下内容:

我从比特流中读取 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]

整个 if MMSI ==p: 因某种原因不相等而被跳过。我不明白为什么这个值远低于max.int:

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

我不明白为什么我会返回 Long 而不是 uint?如果返回的值是 244123456 它就像一个魅力。

4

3 回答 3

1

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

于 2014-09-13T12:27:01.327 回答
1

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

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

于 2014-09-16T13:10:42.903 回答
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怎么可能不长呢?

于 2014-09-13T12:33:48.027 回答