你可以在python中压缩字节并发送它们吗?

时间:2017-09-18 20:35:57

标签: python tcp

我正在编写一个TCP python脚本,我需要前4个字节作为文件的大小。

我通过

获得了文件的大小
SIZE_OF_FILE = os.path.getsize(infile.name)

大小为392399字节。

当我这样做时

s.send(str(SIZE_OF_FILE).encode("utf-8"))

它发送文件,然后在我的服务器上发送

fileSize = conn.recv(4).decode('utf-8')

这应该读取前4个字节,并提取文件大小信息,但它返回3923而不是392399。

作为文件大小......发生了什么? " 392399"应该能够容纳4个字节。

我们假设使用大端。

2 个答案:

答案 0 :(得分:1)

这是因为str(SIZE_OF_FILE)使用十进制表示法对数字进行排版 - 也就是说,您获得字符串"392399",即6个字符(以及UTF-8中的6个字节)。如果您只发送前4个,则发送"3923"

您可能想要做的是使用类似struct.pack的内容来创建包含数字二进制表示的字节字符串。

s.send(struct.pack(format_string, SIZE_OF_FILE))

答案 1 :(得分:0)

您发送的字符串大小为"392399"),即6个ASCII字符,因此为6个字节。您想将其作为原始整数发送;使用struct.pack来做到这一点:

s.send(struct.pack(">i", SIZE_OF_FILE))

收到:

fileSize = struct.unpack(">i", conn.recv(4))[0]

>使它成为大端。要使其成为little-endian,请改用<i是类型;在这种情况下,一个4字节的整数。链接文档有一个类型列表,以防您想使用另一个类型。