Skip to content

Commit

Permalink
lib/py3compat updated, added integers2bytes bytes2integers
Browse files Browse the repository at this point in the history
  • Loading branch information
arekbulski committed Apr 8, 2018
1 parent deb8938 commit 1ecbc0f
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 2 deletions.
2 changes: 2 additions & 0 deletions construct/lib/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
'bytes',
'bytes2bits',
'bytes2integer',
'bytes2integers',
'bytes2str',
'bytestringtype',
'Container',
Expand All @@ -27,6 +28,7 @@
'int2byte',
'integer2bits',
'integer2bytes',
'integers2bytes',
'integertypes',
'iteratebytes',
'iterateints',
Expand Down
19 changes: 18 additions & 1 deletion construct/lib/py3compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,14 @@ def trimstring(data):
import builtins
bytes = builtins.bytes

def integers2bytes(ints):
"""Converts integer generator into bytes."""
return bytes(ints)

def bytes2integers(data):
"""Converts bytes into bytes/bytearray, so indexing/iterating yields integers."""
return data


else:
#: PY2: str unicode
Expand Down Expand Up @@ -140,7 +148,7 @@ def iteratebytes(data):

def iterateints(data):
"""Iterates though b'...' string yielding (0 through 255) integers."""
return (ord(c) for c in data)
return bytearray(data)

def reprstring(data):
"""Ensures there is b- u- prefix before the string."""
Expand All @@ -157,7 +165,16 @@ def trimstring(data):
return repr(data)[1:]

def bytes(countorseq=0):
"""Backports bytes() from PY3."""
if isinstance(countorseq, integertypes):
return b"\x00" * countorseq
else:
return b"".join(chr(x) for x in countorseq)

def integers2bytes(ints):
"""Converts integer generator into bytes."""
return bytes(bytearray(ints))

def bytes2integers(data):
"""Converts bytes into bytes/bytearray, so indexing/iterating yields integers."""
return bytearray(data)
5 changes: 4 additions & 1 deletion tests/lib/test_binary.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ def test_bits2bytes():
assert raises(bits2bytes, b"\x00") == ValueError
assert raises(bits2bytes, b"\x00\x00\x00\x00\x00\x00\x00") == ValueError

def test_swapbytesinbits():
def test_swapbytes():
assert swapbytes(b"") == b""
assert swapbytes(b"abcd") == b"dcba"

def test_swapbytesinbits():
Expand All @@ -52,4 +53,6 @@ def test_swapbytesinbits():
assert raises(swapbytesinbits, b"1") == ValueError

def test_swapbitsinbytes():
assert swapbitsinbytes(b'') == b''
assert swapbitsinbytes(b'\xf0') == b'\x0f'
assert swapbitsinbytes(b'\xf0\x00') == b'\x0f\x00'
10 changes: 10 additions & 0 deletions tests/lib/test_py3compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,13 @@ def test_iteratebytes():
def test_iterateints():
assert list(iterateints(b"abc")) == [97,98,99]
assert all(list(iterateints(int2byte(i))) == [i] for i in range(256))

def test_bytes():
assert bytes() == b''
assert bytes(2) == b'\x00\x00'
assert bytes([1,2]) == b'\x01\x02'

def test_bytes_integers():
assert bytes2integers(b'abc')[0] == 97
assert list(bytes2integers(b'abc')) == [97,98,99]
assert integers2bytes([97,98,99]) == b'abc'

0 comments on commit 1ecbc0f

Please sign in to comment.