/ / Czy Python 3 to_bytes został przeniesiony z powrotem do Pythona 2.7? - python

Czy Python 3 to_bytes został przeniesiony do Pythona 2.7? - python

Jest to funkcja, po której: -

http://docs.python.org/3/library/stdtypes.html#int.to_bytes

Potrzebuję dużego wsparcia endianizmu.

Odpowiedzi:

14 dla odpowiedzi № 1

Na podstawie odpowiedzi @nneonneo, oto funkcja, która emuluje API to_bytes:

def to_bytes(n, length, endianess="big"):
h = "%x" % n
s = ("0"*(len(h) % 2) + h).zfill(length*2).decode("hex")
return s if endianess == "big" else s[::-1]

11 dla odpowiedzi nr 2

Aby odpowiedzieć na twoje oryginalne pytanie, to_bytes metoda dla int obiekty nie zostały ponownie przeniesione do Pythona 2.7 z Pythona 3. Zostało to rozważone, ale ostatecznie odrzucone. Zobacz dyskusję tutaj.


7 dla odpowiedzi nr 3

Aby spakować dowolną długość longW Pythonie 2.x można użyć następujących opcji:

>>> n = 123456789012345678901234567890L
>>> h = "%x" % n
>>> s = ("0"*(len(h) % 2) + h).decode("hex")
>>> s
"x01x8exe9x0fxf6xc3sxe0xeeN?nxd2"

Daje to liczbę w kolejności big-endian; dla little endian odwróć ciąg znaków (s[::-1]).


2 dla odpowiedzi № 4

Prawdopodobnie możesz użyć struct.pack zamiast:

>>> import struct
>>> struct.pack(">i", 123)
"x00x00x00{"

Nie przeszkadza to w ustalaniu dowolnych długości int.to_bytes tak, ale wątpię, żebyś tego potrzebował.