diff -r d9828c438889 Doc/library/stdtypes.rst --- a/Doc/library/stdtypes.rst Sat May 25 18:48:16 2013 +0200 +++ b/Doc/library/stdtypes.rst Sat May 25 16:59:40 2013 -0400 @@ -502,6 +502,15 @@ given, an :exc:`OverflowError` is raised. The default value for *signed* is ``False``. + Equivalent to:: + + def to_bytes(n, length, byteorder, signed=False): + if byteorder == 'little': + order = range(length) + elif byteorder == 'big': + order = reversed(range(length)) + return bytes((n >> i*8) & 0xff for i in order) + .. versionadded:: 3.2 .. classmethod:: int.from_bytes(bytes, byteorder, \*, signed=False) @@ -532,6 +541,18 @@ The *signed* argument indicates whether two's complement is used to represent the integer. + Equivalent to:: + + def from_bytes(bytes, byteorder, signed=False): + if byteorder == 'little': + little_ordered = list(bytes) + elif byteorder == 'big': + little_ordered = list(reversed(bytes)) + n = sum(little_ordered[i] << i*8 for i in range(len(little_ordered))) + if signed and little_ordered and (little_ordered[-1] & 0x80): + n -= 1 << 8*len(little_ordered) + return n + .. versionadded:: 3.2 diff -r d9828c438889 Lib/test/test_long.py --- a/Lib/test/test_long.py Sat May 25 18:48:16 2013 +0200 +++ b/Lib/test/test_long.py Sat May 25 16:59:40 2013 -0400 @@ -998,6 +998,12 @@ def test_to_bytes(self): def check(tests, byteorder, signed=False): + def equivalent_python(n, length, byteorder, signed=False): + if byteorder == 'little': + order = range(length) + elif byteorder == 'big': + order = reversed(range(length)) + return bytes((n >> i*8) & 0xff for i in order) for test, expected in tests.items(): try: self.assertEqual( @@ -1007,6 +1013,15 @@ raise AssertionError( "failed to convert {0} with byteorder={1} and signed={2}" .format(test, byteorder, signed)) from err + try: + self.assertEqual( + equivalent_python(test, len(expected), byteorder, signed=signed), + expected) + except Exception as err: + raise AssertionError( + "example from docs is not equivalent for conversion of {0} with byteorder={1} and signed={2}" + .format(test, byteorder, signed)) from err + # Convert integers to signed big-endian byte arrays. tests1 = { @@ -1097,6 +1112,15 @@ def test_from_bytes(self): def check(tests, byteorder, signed=False): + def equivalent_python(bytes, byteorder, signed=False): + if byteorder == 'little': + little_ordered = list(bytes) + elif byteorder == 'big': + little_ordered = list(reversed(bytes)) + n = sum(little_ordered[i] << i*8 for i in range(len(little_ordered))) + if signed and little_ordered and (little_ordered[-1] & 0x80): + n -= 1 << 8*len(little_ordered) + return n for test, expected in tests.items(): try: self.assertEqual( @@ -1106,6 +1130,14 @@ raise AssertionError( "failed to convert {0} with byteorder={1!r} and signed={2}" .format(test, byteorder, signed)) from err + try: + self.assertEqual( + equivalent_python(test, byteorder, signed=signed), + expected) + except Exception as err: + raise AssertionError( + "example from docs is not equivalent for conversion of {0} with byteorder={1!r} and signed={2}" + .format(test, byteorder, signed)) from err # Convert signed big-endian byte arrays to integers. tests1 = {