From aeb1e61aa753beacf442763f0df23af8fb9c781c Mon Sep 17 00:00:00 2001 From: amoibos Date: Sun, 11 Jan 2015 23:29:47 +0100 Subject: [PATCH 1/2] let python do the endian stuff --- PIL/_binary.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/PIL/_binary.py b/PIL/_binary.py index 51ce45a79..89a05a46f 100644 --- a/PIL/_binary.py +++ b/PIL/_binary.py @@ -11,6 +11,8 @@ # See the README file for information on usage and redistribution. # +from struct import unpack, pack + if bytes is str: def i8(c): return ord(c) @@ -34,7 +36,7 @@ def i16le(c, o=0): c: string containing bytes to convert o: offset of bytes to convert in string """ - return i8(c[o]) | (i8(c[o+1]) << 8) + return unpack("H", c[o:o+2]) def i32be(c, o=0): - return ((i8(c[o]) << 24) | (i8(c[o+1]) << 16) | - (i8(c[o+2]) << 8) | i8(c[o+3])) + return unpack(">I", c[o:o+4]) # Output, le = little endian, be = big endian def o16le(i): - return o8(i) + o8(i >> 8) + return pack("> 8) + o8(i >> 16) + o8(i >> 24) + return pack("> 8) + o8(i) + return pack(">H", i) def o32be(i): - return o8(i >> 24) + o8(i >> 16) + o8(i >> 8) + o8(i) + return pack(">I", i) # End of file From f644adbb05d615a9902ef3643714d5fe8049cea3 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 2 Mar 2015 09:56:47 +1100 Subject: [PATCH 2/2] Fixed binary conversion bug, and added corresponding tests --- PIL/_binary.py | 8 ++++---- Tests/test_binary.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 Tests/test_binary.py diff --git a/PIL/_binary.py b/PIL/_binary.py index 89a05a46f..2f5e8ffd4 100644 --- a/PIL/_binary.py +++ b/PIL/_binary.py @@ -36,7 +36,7 @@ def i16le(c, o=0): c: string containing bytes to convert o: offset of bytes to convert in string """ - return unpack("H", c[o:o+2]) + return unpack(">H", c[o:o+2])[0] def i32be(c, o=0): - return unpack(">I", c[o:o+4]) + return unpack(">I", c[o:o+4])[0] # Output, le = little endian, be = big endian diff --git a/Tests/test_binary.py b/Tests/test_binary.py new file mode 100644 index 000000000..4d3fb5914 --- /dev/null +++ b/Tests/test_binary.py @@ -0,0 +1,28 @@ +from helper import unittest, PillowTestCase + +from PIL import _binary + +class TestBinary(PillowTestCase): + + def test_standard(self): + self.assertEqual(_binary.i8(b'*'), 42) + self.assertEqual(_binary.o8(42), b'*') + + def test_little_endian(self): + self.assertEqual(_binary.i16le(b'\xff\xff\x00\x00'), 65535) + self.assertEqual(_binary.i32le(b'\xff\xff\x00\x00'), 65535) + + self.assertEqual(_binary.o16le(65535), b'\xff\xff') + self.assertEqual(_binary.o32le(65535), b'\xff\xff\x00\x00') + + def test_big_endian(self): + self.assertEqual(_binary.i16be(b'\x00\x00\xff\xff'), 0) + self.assertEqual(_binary.i32be(b'\x00\x00\xff\xff'), 65535) + + self.assertEqual(_binary.o16be(65535), b'\xff\xff') + self.assertEqual(_binary.o32be(65535), b'\x00\x00\xff\xff') + +if __name__ == '__main__': + unittest.main() + +# End of file \ No newline at end of file