]> granicus.if.org Git - python/commitdiff
Packer.pack_uhyper(): Fixes needed to properly pack unsigned 64 bit
authorBarry Warsaw <barry@python.org>
Thu, 29 May 1997 21:01:35 +0000 (21:01 +0000)
committerBarry Warsaw <barry@python.org>
Thu, 29 May 1997 21:01:35 +0000 (21:01 +0000)
longs where the top bit is set.  First, change the masks so that they
are `L' longs, otherwise the sign bits will get propagated to the
result.  Next, do not coerce to int before sending to pack_uint()
otherwise Python will generate an OverflowError.  Here is a test
program that fails without the patch, but now succeeds:

import xdrlib

addr = (132, 151, 1, 71)
uint = 0L
for a in addr:
    uint = (uint << 8) | a

ulong64 = uint << 32

p = xdrlib.Packer()
p.pack_uhyper(ulong64)
buf = p.get_buffer()
u = xdrlib.Unpacker(buf)
ulong64prime = u.unpack_uhyper()

if ulong64 == ulong64prime:
    print 'okay'
else:
    print 'bogus'

print ulong64, ulong64prime

Lib/xdrlib.py

index 0345704c911047b32034779d856ce24625b3b935..50a9eea3c40ec82fae74c48872e5397ca362b9e4 100644 (file)
@@ -55,8 +55,8 @@ class Packer:
        else: self.__buf = self.__buf + '\0\0\0\0'
 
     def pack_uhyper(self, x):
-       self.pack_uint(int(x>>32 & 0xffffffff))
-       self.pack_uint(int(x & 0xffffffff))
+       self.pack_uint(x>>32 & 0xffffffffL)
+       self.pack_uint(x & 0xffffffffL)
 
     pack_hyper = pack_uhyper