2
\$\begingroup\$

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?

\$\endgroup\$
3
\$\begingroup\$

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")
\$\endgroup\$
  • \$\begingroup\$ Ooohhh... so int has a bit_length() method? That's news to me... Thanks for telling me that! I'll probably not use math.ceil though. (n + 7) >> 3 might be better since it keeps everything in int land. Anyways, thanks! \$\endgroup\$ – pepoluan Jun 14 at 17:50

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.