summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelie <elie>2013-04-09 18:31:26 +0000
committerelie <elie>2013-04-09 18:31:26 +0000
commit3f20cc46c0ead4627f6c327e0c8cfc3f8bf38c68 (patch)
treece2d2f8b5ff4f2d3cc979beab697d35a40703953
parent5142fc4d6549672d4a7d9f45123609e17b76275a (diff)
downloadpyasn1-3f20cc46c0ead4627f6c327e0c8cfc3f8bf38c68.tar.gz
fix to REAL type decoder to handle negative REAL values correctly. test
case added.
-rw-r--r--CHANGES2
-rw-r--r--pyasn1/codec/ber/decoder.py8
-rw-r--r--test/codec/ber/test_decoder.py6
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))