Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python通过套接字发送二进制数据_Python_Sockets - Fatal编程技术网

使用Python通过套接字发送二进制数据

使用Python通过套接字发送二进制数据,python,sockets,Python,Sockets,我正在寻找脚本的一些基本要求在过去的一年。协议将发送的帧定义为由特定长度和字节顺序的二进制数据组成 我只编写过通过套接字(HTTP)发送字符串的小程序。例如,如何实现SPDY控制帧头?例如,我曾尝试使用位字符串库和numpy来控制控制帧头的所有不同部分的大小,但没有任何效果。当前用于python的SPDY库使用cython和C数据类型,我发现它非常不可预测。我想知道如何使用纯python构建简单的请求,或者非常简单地说,如何构建与协议定义完全相同的东西并通过套接字发送?通常bytearray类将

我正在寻找脚本的一些基本要求在过去的一年。协议将发送的帧定义为由特定长度和字节顺序的二进制数据组成


我只编写过通过套接字(HTTP)发送字符串的小程序。例如,如何实现SPDY控制帧头?例如,我曾尝试使用位字符串库和numpy来控制控制帧头的所有不同部分的大小,但没有任何效果。当前用于python的SPDY库使用cython和C数据类型,我发现它非常不可预测。我想知道如何使用纯python构建简单的请求,或者非常简单地说,如何构建与协议定义完全相同的东西并通过套接字发送?

通常
bytearray
类将是您的朋友(如果我正确理解您的问题)。您可以通过套接字发送:

my_bytes = bytearray()
my_bytes.append(123)
my_bytes.append(125)

// my_bytes is b'{}' now

s.send(my_bytes)
按照协议规范创建一个字节接一个字节。当您收到数据时,此功能也会起作用:

data = s.recv(2048)
my_bytes = bytearray(data)
我不太了解SPDY协议,但例如,控制位是消息中的第一个位(不是字节)。您可以通过二进制文件从
my_bytes
检索它,例如:

control_frame = my_bytes[0] & 128
这是因为
128
是二进制的
10000000
,因此是二进制的,只会给出第一位(记住每个字节有8位,这就是为什么我们有7个零)

这就是手工操作的方式。当然,我建议使用一些库,因为编写一个合适的协议处理程序会花费很多时间,您可能会发现它非常困难,而且可能效率不高(当然这取决于您的需要)。

您还可以使用来定义带有字符串的头格式,并直接解析它

要生成数据包,请执行以下操作:

fmt = 'B I 4b'
your_binary_data = pack(fmt, header_data)
sock.sendall(your_binary_data)
其中fmt表示报头格式(“B I 4b”只是a,显然不适用于您的SPDY报头,例如)。不幸的是,您将不得不处理非字节对齐的头字段,可能需要解析更大的块,然后根据您的格式对它们进行划分

除此之外,要解析标头:

unpacker = struct.Struct('B I 4b')
unpacked_data = unpacker.unpack(s.recv(unpacker.size))
解包的_数据将包含一个包含已解析数据的元组


struct模块在Python值和以Python字符串表示的C结构之间执行转换。我无法保证这种方法的效率,但它通过调整fmt字符串帮助我解析了不同的协议。

感谢我的研究,如果我将每个字节初始化为0b…?@ubiQ bits,我如何将字节数组中的位打印为可读字符串?位仅为0或1。如果要打印字节数组,只需执行
打印我的字节
。Python解释器应该自动将每个字节转换为其字符串表示形式。请注意,它可能不“可读”(取决于它的确切含义)。我想在控制台中将其作为字符串读取,但它正在输出原始二进制文件atm@ubiQ你到底在那个数组里放了什么?给我看一些代码。请注意,只有32到126之间的字节是可打印的(ASCII)。control_header=bytearray()control_header.append(0b1)#control_flag control_header.append(0b000000000000010)#version control_header.append(0b0000000000000001)#type control_header.append(0B000000000)#flags control_header.append(0B000000000000000000000000000000)#长度打印我的字节