簡體   English   中英

通過python 3中的網絡套接字接收二進制數據

[英]Receiving binary data through network sockets in python 3

在我的網絡課程中,我要做的一個實驗是使一個客戶端按大端序接收5個熟悉的32位整數並使它們變活。 我決定使用python,一切正常,但是我收到了奇怪的十六進制代碼。

\\ X00 \\ X00 \\ x00o \\ X00 \\ X00 \\ X00 \\ XE4 \\ X00 \\ X00 \\ X01 \\ XB3 \\ X00 \\ X00 \\ X01 \\ XDB \\ X00 \\ X00 \\ X01 \\ XEC

我可以輕松轉換大多數,但x00o確實讓我感到困惑,228 435 475 492,在那之后我相信這4個。 您能幫我取消服務器消息嗎?

import socket 
import sys
try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error:
    print('Failed to create socket')
    sys.exit()
print('Socket Created')

host = 'localhost'
port = 5071

try:
    remote_ip = socket.gethostbyname(host)

except socket.gaierror:
    #could not resolve
    print('Hostname could not be resolved. Exiting')
    sys.exit()

s.connect((remote_ip , port))

print('Socket Connected to ' + host + ' on ip ' + remote_ip)

reply = s.recv(4096)

print(reply)

code.py

import sys
import struct


def convert_data_to_ints(data, big_endian=True):
    int_count = len(data) // 4  # Assuming uint is 4 bytes long !!!
    fmt = ">" if big_endian else "<"
    fmt += "I" * int_count
    return struct.unpack(fmt, data[:int_count * 4])


def main():
    print("Python {} on {}\n".format(sys.version, sys.platform))
    data = b"\x00\x00\x00o\x00\x00\x00\xe4\x00\x00\x01\xb3\x00\x00\x01\xdb\x00\x00\x01\xec"
    ints_be = convert_data_to_ints(data)
    print("Big endian: {}".format(ints_be))
    ints_le = convert_data_to_ints(data, big_endian=False)
    print("Little endian: {}".format(ints_le))


if __name__ == "__main__":
    main()

注意事項

  • convert_data_to_ints
    • 使用[Python]:結構。 解壓縮fmt,buffer以執行轉換(還可以檢查[SO]:Python struct.pack()行為以獲取有關如何在內存中以及在服務器響應中表示整數的更多詳細信息)
    • 轉換為unsigned int"I"格式)。 檢查網頁上面在第(1 )在“ 格式字符串 ”節
    • 依賴於int為4字節長的事實(我不想對"IIIII"進行硬編碼, "IIIII"想使其更加通用)。 如果字符串長度不是4的整數倍( int的整數 ),則末尾不完整的int (最多3個字節)將被丟棄(當然,更好的方式是填充字符串並轉換“ incomplete數據,但這不在問題范圍內)
    • 返回一個包含已轉換整數的元組
  • main

輸出

 E:\\Work\\Dev\\StackOverflow\\q048508018>"c:\\install\\Python\\3.4.3\\x86\\python.exe" code.py Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32 Big endian: (111, 228, 435, 475, 492) Little endian: (1862270976, 3825205248, 3003187200, 3674275840, 3959488512) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM