繁体   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