Ổ cắm htons python

Tôi muốn chuyển đổi một giá trị số nguyên thành một chuỗi giá trị hex, trong endian nhỏ. Ví dụ, 5707435436569584000 sẽ trở thành

>>> struct.pack('<Q', 5707435436569584202).encode('hex')
'4ae2344f4ae2344f'
>>> '\x4a\xe2\x34\x4f\x4a\xe2\x34\x4f'
'J\xe24OJ\xe24O'
0

Nội dung chính Hiển thị

  • Giải thích về Little Endian và Big Endian
  • Truyền thông mạng hoạt động như thế nào
  • Hàm sắp xếp byte
  • Làm cách nào để bạn chuyển đổi hex thành endian nhỏ trong Python?
  • Python là little endian hay big endian?
  • Byteorder trong Python là gì?
  • Làm cách nào để bạn chuyển đổi int thành byte trong Python?

Tất cả googlefu của tôi đang tìm kiếm cho tôi là

>>> struct.pack('<Q', 5707435436569584202).encode('hex')
'4ae2344f4ae2344f'
>>> '\x4a\xe2\x34\x4f\x4a\xe2\x34\x4f'
'J\xe24OJ\xe24O'
1 mang lại cho tôi
>>> struct.pack('<Q', 5707435436569584202).encode('hex')
'4ae2344f4ae2344f'
>>> '\x4a\xe2\x34\x4f\x4a\xe2\x34\x4f'
'J\xe24OJ\xe24O'
2, đây không phải là điều tôi muốn

Tôi có thể có thể tách chuỗi đó theo cách thủ công và tạo chuỗi tôi muốn nhưng tôi hy vọng ai đó có thể chỉ cho tôi một tùy chọn tốt hơn

đã hỏi 30 tháng 10 năm 2012 lúc 15. 01

Ổ cắm htons python

2

Bạn cần sử dụng mô-đun

>>> struct.pack('<Q', 5707435436569584202).encode('hex')
'4ae2344f4ae2344f'
>>> '\x4a\xe2\x34\x4f\x4a\xe2\x34\x4f'
'J\xe24OJ\xe24O'
3

>>> import struct
>>> struct.pack('<Q', 5707435436569584000)
'\x80\xe14OJ\xe24O'
>>> struct.pack('<Q', 5707435436569584202)
'J\xe24OJ\xe24O'

Ở đây

>>> struct.pack('<Q', 5707435436569584202).encode('hex')
'4ae2344f4ae2344f'
>>> '\x4a\xe2\x34\x4f\x4a\xe2\x34\x4f'
'J\xe24OJ\xe24O'
4 biểu thị little-endian và
>>> struct.pack('<Q', 5707435436569584202).encode('hex')
'4ae2344f4ae2344f'
>>> '\x4a\xe2\x34\x4f\x4a\xe2\x34\x4f'
'J\xe24OJ\xe24O'
0 mà chúng tôi muốn đóng gói một long dài không dấu (8 byte)

Lưu ý rằng Python sẽ sử dụng các ký tự ASCII cho bất kỳ byte nào nằm trong phạm vi ASCII có thể in được để biểu thị chuỗi byte kết quả, do đó, các phần

>>> struct.pack('<Q', 5707435436569584202).encode('hex')
'4ae2344f4ae2344f'
>>> '\x4a\xe2\x34\x4f\x4a\xe2\x34\x4f'
'J\xe24OJ\xe24O'
1,
>>> struct.pack('<Q', 5707435436569584202).encode('hex')
'4ae2344f4ae2344f'
>>> '\x4a\xe2\x34\x4f\x4a\xe2\x34\x4f'
'J\xe24OJ\xe24O'
2 và
>>> struct.pack('<Q', 5707435436569584202).encode('hex')
'4ae2344f4ae2344f'
>>> '\x4a\xe2\x34\x4f\x4a\xe2\x34\x4f'
'J\xe24OJ\xe24O'
3 của kết quả trên

>>> struct.pack('<Q', 5707435436569584202).encode('hex')
'4ae2344f4ae2344f'
>>> '\x4a\xe2\x34\x4f\x4a\xe2\x34\x4f'
'J\xe24OJ\xe24O'

đã trả lời 30 tháng 10 năm 2012 lúc 15. 03

Martijn Pieters Martijn Pieters

985k273 huy hiệu vàng3874 huy hiệu bạc3235 huy hiệu đồng

6

Tôi biết nó là một chủ đề cũ, nhưng nó vẫn hữu ích. Đây là hai xu của tôi khi sử dụng python3

hex_string = hex(5707435436569584202) # '0x4f34e24a4f34e180' as you said
bytearray.fromhex(hex_string[2:]).reverse()

Vì vậy, điều quan trọng là chuyển đổi nó thành một mảng phụ và đảo ngược nó. Trong một dòng

bytearray.fromhex(hex(5707435436569584202)[2:])[::-1] # bytearray(b'J\xe24OJ\xe24O')

Tái bút. Bạn có thể coi dữ liệu "bytearray" như "byte" và thậm chí trộn chúng với

>>> struct.pack('<Q', 5707435436569584202).encode('hex')
'4ae2344f4ae2344f'
>>> '\x4a\xe2\x34\x4f\x4a\xe2\x34\x4f'
'J\xe24OJ\xe24O'
4

Cập nhật. Như Will chỉ ra trong các nhận xét, bạn cũng có thể quản lý các số nguyên âm

Để làm cho điều này hoạt động với các số nguyên âm, bạn cần che dấu đầu vào của mình bằng độ dài đầu ra kiểu int ưa thích của bạn. Ví dụ: -16 dưới dạng endian nhỏ uint32_t sẽ là mảng phụ. fromhex(hex(-16 & (2**32-1))[2. ])[. -1], đánh giá thành bytearray(b'\xf0\xff\xff\xff')

đã trả lời 2 tháng 12 năm 2018 lúc 1. 58

Rutrus Rutrus

1.21713 huy hiệu bạc24 huy hiệu đồng

1

Tổng quan

Thế giới điện toán chủ yếu xử lý dữ liệu ở hai định dạng

  • Định dạng Big Endian
  • Định dạng Endian nhỏ

Trong khi hầu hết các máy xử lý dữ liệu ở Định dạng Little Endian thì đường truyền mạng và Internet đang sử dụng Định dạng Big Endian. Do đó, trước khi gửi dữ liệu đến mạng và sau khi nhận dữ liệu từ mạng, việc dịch sang Thứ tự mạng, tức là, sang Thứ tự Big Endian và ngược lại là một nhiệm vụ thường xuyên

Lưu ý rằng, thời gian chạy Java sử dụng Định dạng Big Endian. Độ bền của Python giống như bộ xử lý mà trình thông dịch Python chạy trong đó

Mô-đun ổ cắm của Python cung cấp các chức năng để xử lý các bản dịch của các số nguyên có kích thước khác nhau từ Little Endian sang Big Endian và ngược lại

Giải thích về Little Endian và Big Endian

Số nguyên 32 bit có bốn byte, mỗi byte bao gồm 8 bit

Trong Định dạng Little Endian, byte quan trọng nhất (LSB) sẽ được đặt ở địa chỉ thấp nhất và byte quan trọng nhất (MSB) sẽ được đặt ở địa chỉ cao nhất

Ví dụ: nếu địa chỉ bắt đầu là X, thì byte có trọng số thấp nhất sẽ được đặt trong X và byte có trọng số thấp nhất tiếp theo sẽ được đặt trong X+1, byte có trọng số nhỏ nhất tiếp theo là X+2 và byte có trọng số lớn nhất sẽ là . Trong Little Endian, LSB được lưu trữ ở địa chỉ nhỏ nhất

Ở định dạng Big Endian, byte quan trọng nhất sẽ được đặt ở địa chỉ thấp nhất và byte ít quan trọng nhất sẽ được đặt ở địa chỉ cao nhất

Ví dụ: nếu địa chỉ bắt đầu là X, byte quan trọng nhất sẽ được đặt trong X và byte quan trọng nhất tiếp theo sẽ được đặt trong X+1, byte quan trọng nhất tiếp theo tại X+2 và byte ít quan trọng nhất sẽ là . MSB được lưu trữ tại địa chỉ nhỏ nhất

Cái tên "Endian" xuất phát từ tiểu thuyết "Gulliver's Travels" của Jonathan Swift, trong đó một số người thích ăn trứng luộc từ đầu nhỏ trong khi những người khác ăn chúng từ đầu to

Truyền thông mạng hoạt động như thế nào

Trong các mạng máy tính, trong khi truyền và nhận các gói dữ liệu, chúng được gửi bằng Big Endian Order. Lý do là, giao thức mạng phù hợp với bất kỳ hệ điều hành nào gửi các khung và trường dữ liệu của chúng ở định dạng này như được xác định bởi RFC 1700

RFC 1700, có tiêu đề CON SỐ ĐƯỢC CHỈ ĐỊNH nêu rõ "các số thể hiện ở dạng thập phân và dữ liệu hình ảnh theo thứ tự" lớn-endian""

Tuy nhiên, một số hệ điều hành và máy xử lý dữ liệu ở Định dạng Little Endian. Vì vậy, khi máy chủ đang theo Định dạng Little Indian, dữ liệu nhận được qua mạng cần được dịch sang Định dạng Little Indian hoặc Định dạng Máy chủ

Hàm sắp xếp byte

Mô-đun ổ cắm của Python cung cấp các chức năng để dịch thứ tự máy chủ sang thứ tự mạng và ngược lại

Tên hàm Python

Sự mô tả

hướng dịch

ổ cắm. ntohl(Int32bit_postive)

  • ntohl() chuyển đổi số nguyên 32 bit từ thứ tự mạng thành thứ tự máy chủ.
  • Nếu thứ tự máy chủ giống với thứ tự mạng, chức năng chỉ thực hiện lệnh noop
  • ntohl() sẽ tăng  Lỗi tràn   nếu giá trị âm được chuyển.

Big Endian đến Little Endian

ổ cắm. ntohs(Int32bit_postive)

  • ntohs() của mô-đun ổ cắm chuyển đổi số nguyên 16 bit từ định dạng mạng sang định dạng máy chủ.
  • Nếu thứ tự máy chủ và thứ tự mạng giống nhau, thì chỉ một noop được thực thi
  • ntohs() tăng  một Lỗi tràn   nếu giá trị âm được chuyển.

Big Endian đến Little Endian

ổ cắm. htonl(Int32bit_postive)

  • htonl() chuyển đổi một số nguyên dương 32 bit từ thứ tự byte máy chủ sang thứ tự byte mạng.
  • Nếu thứ tự máy chủ và thứ tự mạng giống nhau, thì chỉ một noop được thực thi
  • htonl() sẽ tăng  Lỗi tràn   nếu giá trị âm được chuyển.

Little Endian đến Big Endian

ổ cắm. htons(Int16bit_postive)

  • htons() chuyển đổi một số nguyên dương 16 bit từ thứ tự byte máy chủ thành thứ tự byte mạng.
  • Nếu thứ tự máy chủ và thứ tự mạng giống nhau, thì chỉ một noop được thực thi
  • htons() tăng  một Lỗi tràn   nếu một giá trị âm được chuyển.

Little Endian đến Big Endian

Thí dụ

ổ cắm nhập khẩu

Int32Bit = 214748300

Int16Bit = 400

#Chuyển đổi số nguyên 32 bit từ thứ tự byte mạng sang thứ tự byte lưu trữ

Int32InHostFormat = ổ cắm. ntohl(Int32Bit)

#Chuyển đổi số nguyên 16 bit từ thứ tự byte mạng sang thứ tự byte lưu trữ

Int16InHostFormat = ổ cắm. ntohs(Int16Bit)

print("Số nguyên 32 bit {} được chuyển đổi từ Thứ tự Byte Mạng thành Thứ tự Byte Máy chủ. {}". định dạng (Int32Bit, Int32InHostFormat))

print("Số nguyên 16 bit {} được chuyển đổi từ Thứ tự Byte Máy chủ thành Thứ tự Byte Mạng. {}". định dạng (Int16InHostFormat, Int16InNetworkFormat))