все Python 3socketфункция
socket.ntohl()
преобразование адресов и порядка байтов
Переводит 32-битное число из сетевого порядка байтов (big-endian) в порядок машины; обратна htonl().
Синтаксис
socket.ntohl(x) -> int
Функция работает с int, а из сокета приходят bytes, и именно здесь путаются: ntohl применяют к числу, прочитанному в порядке машины. Проще сразу прочитать байты в нужном порядке — int.from_bytes(data, 'big') или struct.unpack('!I', data) — и ntohl не понадобится. Повторный вызов отменяет первый: ntohl(htonl(x)) == x.
Примеры
import socket, struct, sys
data = b'\x00\x00\x01\x00' # 256 в сетевом порядке
print(socket.ntohl(int.from_bytes(data, sys.byteorder))) # → 256
print(int.from_bytes(data, 'big')) # → 256
print(struct.unpack('!I', data)[0]) # → 256
print(socket.ntohl(socket.htonl(123456))) # → 123456
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности