\$\begingroup\$
\$\endgroup\$
I have a need to convert wire encoding (big-endian) to little-endian in Python.
The conversion needs to happen as a separate function; I am not allowed to change the function that reads the byte stream because it will break a lot of other functions.
The best I can think of is this:
def be_to_le(value: int) -> int:
assert isinstance(value, int)
numbytes = len(f"0{value:x}") >> 1
if numbytes == 1:
return value
rslt = 0
for b in value.to_bytes(numbytes, byteorder="little"):
rslt <<= 8
rslt |= b
return rslt
Is there a better way?
200_success
145k22 gold badges190 silver badges478 bronze badges
asked May 31, 2019 at 4:37
1 Answer 1
\$\begingroup\$
\$\endgroup\$
1
To calculate number of bytes, better use:
numbytes = math.ceil(value.bit_length() / 8)
And then you can just:
def be_to_le(value: int) -> int:
numbytes = math.ceil(value.bit_length() / 8)
return int.from_bytes(value.to_bytes(numbytes, byteorder="little"), byteorder="big")
answered May 31, 2019 at 16:26
-
\$\begingroup\$ Ooohhh... so
int
has abit_length()
method? That's news to me... Thanks for telling me that! I'll probably not usemath.ceil
though.(n + 7) >> 3
might be better since it keeps everything inint
land. Anyways, thanks! \$\endgroup\$pepoluan– pepoluan2019年06月14日 17:50:43 +00:00Commented Jun 14, 2019 at 17:50
Explore related questions
See similar questions with these tags.
lang-py