2014-09-13 6 views
1

아주 새로운 한 보았고, 나는 다음과 같은 한 붙어있을 것 같다 :파이썬 비트 스트링 UINT는 파이썬에

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

이 경우를 제외하고는 정상적으로 작동하는 것 같다 : 나는 비트 스트림에서 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보다 훨씬 낮은 값 왜 이해가 안 : 나는 긴이 UINT을 반환하지받을 이유

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

내가 이해가 안 돼요? 반환 된 값이 244123456이면 매력처럼 작동합니다.

무엇이 여기에 있습니까? advange에서

덕분에,

난폭 한

답변

1

2147483647는 MAXINT이지만, int로 32 비트와 30 비트를 사용하고 있습니다. 따라서 귀하의 최대 금액은 약 1/4이며 약 5 억입니다.

0

아하, 30 비트를 읽고 uint 값으로 반환하면 자동으로 32 비트 값이 될 것이라고 생각했습니다. 그래서 내가하는 말은 32 비트 값을 만들기 위해 선행 0을 추가해야만하고 작동해야한다는 것입니다. 그것이 내가 시험 한 것이며 이제는 길을 잃었습니다.

같은 방식으로 비교할 값을 인코딩 할 수 있습니다.

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] 

어떻게 더 높은 값 972,999,999 긴 아니라고 할 수있다 그래서 내가 무슨 짓을?

1

중간 값이 긴 값은 'long'입니다. 따라서 예를 들어 2**1000/2**9992L과 같습니다. 이것은 호출 한 메서드의 내부와 관련이 있으며 대부분의 코드에 영향을 미치지 않아야합니다.

실제 문제는 코드에서 int를 목록과 비교하는 것이고, 이는 당신이 원하는 것과 다릅니다. readlist 대신 read 메서드를 사용하여 단일 항목을 반환하거나 반환 된 목록의 첫 번째 요소를 가져올 수 있습니다. if MMSI[0] == p: