]> granicus.if.org Git - python/commitdiff
zlib.crc32 and zlib.adler32 now return an unsigned value as any sane person
authorGregory P. Smith <greg@mad-scientist.com>
Mon, 17 Mar 2008 20:24:09 +0000 (20:24 +0000)
committerGregory P. Smith <greg@mad-scientist.com>
Mon, 17 Mar 2008 20:24:09 +0000 (20:24 +0000)
would expect.

Fixes issues1202.

Doc/library/zlib.rst
Lib/test/test_zlib.py
Modules/zlibmodule.c

index dda0b9c30c30049fdb7865b5c06391e1f5f6fc7f..e55e52a1ca86698bc42453ebcba5feaeacf1e35f 100644 (file)
@@ -42,6 +42,8 @@ The available exception and functions in this module are:
    the algorithm is designed for use as a checksum algorithm, it is not suitable
    for use as a general hash algorithm.
 
+   Always returns an unsigned 32-bit integer.
+
 
 .. function:: compress(string[, level])
 
@@ -74,6 +76,8 @@ The available exception and functions in this module are:
    the algorithm is designed for use as a checksum algorithm, it is not suitable
    for use as a general hash algorithm.
 
+   Always returns an unsigned 32-bit integer.
+
 
 .. function:: decompress(string[, wbits[, bufsize]])
 
index 13656d6fe958bb521c9eef54f931b56db00f4716..6b7d4a6eb067e0a2fa6df95c7ad937dbfd9b9aaa 100644 (file)
@@ -38,6 +38,14 @@ class ChecksumTestCase(unittest.TestCase):
         self.assertEqual(zlib.crc32(b"penguin"), zlib.crc32(b"penguin", 0))
         self.assertEqual(zlib.adler32(b"penguin"),zlib.adler32(b"penguin",1))
 
+    def test_crc32_adler32_unsigned(self):
+        foo = 'abcdefghijklmnop'
+        # explicitly test signed behavior
+        self.assertEqual(zlib.crc32(foo), 2486878355)
+        self.assertEqual(zlib.crc32('spam'), 1138425661)
+        self.assertEqual(zlib.adler32(foo+foo), 3573550353)
+        self.assertEqual(zlib.adler32('spam'), 72286642)
+
 
 
 class ExceptionTestCase(unittest.TestCase):
index 441d61d53c63cd9c9590ec8c53a8b3d2385c85b9..a9783707039a3a983ceb93b0f24b8b51e11dd301 100644 (file)
@@ -922,7 +922,7 @@ PyZlib_adler32(PyObject *self, PyObject *args)
     if (!PyArg_ParseTuple(args, "s#|k:adler32", &buf, &len, &adler32val))
        return NULL;
     adler32val = adler32(adler32val, buf, len);
-    return PyLong_FromLong(adler32val);
+    return PyLong_FromUnsignedLong(adler32val & 0xffffffff);
 }
 
 PyDoc_STRVAR(crc32__doc__,
@@ -940,7 +940,7 @@ PyZlib_crc32(PyObject *self, PyObject *args)
     if (!PyArg_ParseTuple(args, "s#|k:crc32", &buf, &len, &crc32val))
        return NULL;
     crc32val = crc32(crc32val, buf, len);
-    return PyLong_FromLong(crc32val);
+    return PyLong_FromUnsignedLong(crc32val & 0xffffffff);
 }