-
Notifications
You must be signed in to change notification settings - Fork 4.7k
Expand file tree
/
Copy pathbytes_int_conversion.py
More file actions
97 lines (72 loc) · 2.19 KB
/
bytes_int_conversion.py
File metadata and controls
97 lines (72 loc) · 2.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
"""
Bytes-Integer Conversion
Convert between Python integers and raw byte sequences in both big-endian
and little-endian byte orders.
Reference: https://en.wikipedia.org/wiki/Endianness
Complexity:
Time: O(b) where b is the number of bytes in the representation
Space: O(b)
"""
from __future__ import annotations
from collections import deque
def int_to_bytes_big_endian(number: int) -> bytes:
"""Convert a non-negative integer to bytes in big-endian order.
Args:
number: A non-negative integer to convert.
Returns:
A bytes object with the most significant byte first.
Examples:
>>> int_to_bytes_big_endian(17)
b'\\x11'
"""
byte_buffer: deque[int] = deque()
while number > 0:
byte_buffer.appendleft(number & 0xFF)
number >>= 8
return bytes(byte_buffer)
def int_to_bytes_little_endian(number: int) -> bytes:
"""Convert a non-negative integer to bytes in little-endian order.
Args:
number: A non-negative integer to convert.
Returns:
A bytes object with the least significant byte first.
Examples:
>>> int_to_bytes_little_endian(17)
b'\\x11'
"""
byte_buffer: list[int] = []
while number > 0:
byte_buffer.append(number & 0xFF)
number >>= 8
return bytes(byte_buffer)
def bytes_big_endian_to_int(byte_string: bytes) -> int:
"""Convert a big-endian byte sequence to an integer.
Args:
byte_string: Bytes with the most significant byte first.
Returns:
The decoded integer value.
Examples:
>>> bytes_big_endian_to_int(b'\\x11')
17
"""
number = 0
for byte in byte_string:
number <<= 8
number += byte
return number
def bytes_little_endian_to_int(byte_string: bytes) -> int:
"""Convert a little-endian byte sequence to an integer.
Args:
byte_string: Bytes with the least significant byte first.
Returns:
The decoded integer value.
Examples:
>>> bytes_little_endian_to_int(b'\\x11')
17
"""
number = 0
exponent = 0
for byte in byte_string:
number += byte << exponent
exponent += 8
return number