From 3f20cc46c0ead4627f6c327e0c8cfc3f8bf38c68 Mon Sep 17 00:00:00 2001 From: elie Date: Tue, 9 Apr 2013 18:31:26 +0000 Subject: fix to REAL type decoder to handle negative REAL values correctly. test case added. --- CHANGES | 2 ++ pyasn1/codec/ber/decoder.py | 8 +++----- test/codec/ber/test_decoder.py | 6 ++++++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index 5514a06..561dedd 100644 --- a/CHANGES +++ b/CHANGES @@ -13,6 +13,8 @@ Revision 0.1.7 - Fix to REAL type encoder to force primitive encoding form encoding. - Fix to CHOICE decoder to handle explicitly tagged, indefinite length mode encoding +- Fix to REAL type decoder to handle negative REAL values correctly. Test + case added. Revision 0.1.6 -------------- diff --git a/pyasn1/codec/ber/decoder.py b/pyasn1/codec/ber/decoder.py index 4dd00f3..be0cf49 100644 --- a/pyasn1/codec/ber/decoder.py +++ b/pyasn1/codec/ber/decoder.py @@ -254,9 +254,7 @@ class RealDecoder(AbstractSimpleDecoder): if not head: return self._createComponent(asn1Spec, tagSet, 0.0), tail fo = oct2int(head[0]); head = head[1:] - if fo & 0x40: # infinite value - value = fo & 0x01 and '-inf' or 'inf' - elif fo & 0x80: # binary enoding + if fo & 0x80: # binary enoding n = (fo & 0x03) + 1 if n == 4: n = oct2int(head[0]) @@ -276,6 +274,8 @@ class RealDecoder(AbstractSimpleDecoder): if fo & 0x40: # sign bit p = -p value = (p, 2, e) + elif fo & 0x40: # infinite value + value = fo & 0x01 and '-inf' or 'inf' elif fo & 0xc0 == 0: # character encoding try: if fo & 0x3 == 0x1: # NR1 @@ -292,8 +292,6 @@ class RealDecoder(AbstractSimpleDecoder): raise error.SubstrateUnderrunError( 'Bad character Real syntax' ) - elif fo & 0xc0 == 0x40: # special real value - pass else: raise error.SubstrateUnderrunError( 'Unknown encoding (tag %s)' % fo diff --git a/test/codec/ber/test_decoder.py b/test/codec/ber/test_decoder.py index 8dd7848..36999e8 100644 --- a/test/codec/ber/test_decoder.py +++ b/test/codec/ber/test_decoder.py @@ -239,6 +239,12 @@ class RealDecoderTestCase(unittest.TestCase): ints2octs((9, 4, 128, 11, 4, 77)) ) == (univ.Real((1101, 2, 11)), null) + def testBin3(self): + assert decoder.decode( + ints2octs((9, 3, 192, 10, 123)) + ) == (univ.Real((-123, 2, 10)), null) + + def testPlusInf(self): assert decoder.decode( ints2octs((9, 1, 64)) -- cgit v1.2.1