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,
粗暴
答案 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不长?