Python bitstring 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
Я не понимаю, почему я вернул Лонг, а не уинт? Если возвращаемое значение 244123456, оно работает как шарм.
Что мне здесь не хватает?
спасибо за преимущество,
дебошир
3 ответа
2147483647
это maxint, но int это 32 бита, а вы используете 30 бит. Таким образом, ваш максимум составляет 1/4 от этого, или около 500 миллионов.
Значения будут "длинными", если промежуточное значение было длинным. Так например 2**1000 / 2**999
будет равно 2L
, Это просто связано с внутренностями метода, который вы вызвали, и не должно влиять на большую часть кода.
Реальная проблема заключается в том, что вы сравниваете в своем коде сравнение int со списком, а это не то, что вы хотите делать. Вы можете использовать read
метод, а не readlist
чтобы вернуть один элемент или взять первый элемент возвращенного списка: if MMSI[0] == p:
Ага, я подумал, что если я прочитаю 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 не длинное?