2015-01-25 4 views
0

나는 ASN.1을 배우기 시작했고 pyasn1을 사용하여 실험을했습니다. 기본적으로 pyasn1은 10을 사용하여 실수를 인코딩합니다. 또한 지원베이스 2이고 내 프로그램에서베이스 2를 사용해야합니다. 하지만 인코딩에 문제가있는 것 같습니다.ASN.1 기본 2의 실수 인코딩 (pyasn1 포함)

from pyasn1.type import univ 
from pyasn1.codec.ber import encoder, decoder 
import binascii 

for i in xrange(4): 
    r=univ.Real((1,2,-i)) 
    m=encoder.encode(r) 
    print r,"->",decoder.decode(m)[0],"data:",binascii.b2a_hex(m) 

출력은 :

1.0 -> 2.0 data: 0903830101 
0.5 -> 2.0 data: 0903830101 
0.25 -> 0.25 data: 090380fe01 
0.125 -> 0.125 data: 090380fd01 

두 숫자 0.5와 동일한 순서로 인코딩 1.0 인 코드 번호 0.5 기지국 2에서 1.0 테스트 코드 인 경우 I 이상한 행동을 발견 2.0으로 디코딩 된 번호. 동일한 동작은 BER 및 DER 인코더 모두에서 발생합니다.

무엇이 잘못되었는지를 알려주세요.

+0

의 모습이 선을 대체 encoder.py : 현재 버전에 대한 은 수정 다음 변경을하는 것입니다 이 버그는 pyasn1 –

+0

의 최신 버전에서 수정되었습니다. 수정은 실제로 현재 개발 버전에만 있습니다. –

답변

0

이 동작은 pyasn1 개발 버전에서 이미 수정 된 버그에 해당합니다./파일 pyasn1/코덱/BER에 을 지수에게

 eo = null 
     while e not in (0, -1): 
      eo = int2oct(e&0xff) + eo 
      e >>= 8 
     if e == 0 and eo and oct2int(eo[0]) & 0x80: 
      eo = int2oct(0) + eo 
     n = len(eo) 
     if n > 0xff: 
      raise error.PyAsn1Error('Real exponent overflow') 
     if n == 1: 
      pass 
     elif n == 2: 
      fo |= 1 
     elif n == 3: 
      fo |= 2 
     else: 
      fo |= 3 
      eo = int2oct(n//0xff+1) + eo 

를 인코딩 라인을 찾아

 eo = null 
     while True: 
      _e = e&0xff 
      eo = int2oct(_e) + eo 
      e >>= 8 
      if e==0: # positive number ends up with 0 
       if not _e&0x80: # sequence should start with positive byte 
        break 
      elif e==-1: # negative number ends up with -1 
       if _e&0x80: # sequence should start with negative byte 
        break 
     n = len(eo)-1 
     if n > 0xff: 
      raise error.PyAsn1Error('Real exponent overflow') 
     if n < 3: 
      fo |= n 
     else: 
      fo |= 3 
      eo = int2oct(n) + eo