我正在编写一个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个字节。
我们假设使用大端。
答案 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字节的整数。链接文档有一个类型列表,以防您想使用另一个类型。