Python套接字:转换字节目标

2024-09-30 16:29:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我通过TCP套接字接收数据,它应该是"12345678901"作为值。我还试图通过byteorder ='big'和{}中的int.from_bytes来转换它 ,struct.unpack。。。在

但效果并不好。在

我得到的实际值是b'\xd2\x04.\x16\xc5"'( << data == conn.recv(2048))

我应该用哪种方式把它转换成整数?在

编辑:在服务器端(非常典型)

TCP_IP = '192.168.3.50'
TCP_PORT = 8000
BUFFER_SIZE = 2048  

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)

conn, addr = s.accept()
print('Connection address:', addr)

data_dummy = 0

while 1:

data = conn.recv(BUFFER_SIZE)
if not data: break
if data_dummy != data or data_dummy == 0:
    print("received data:", data)
    print("converted(big)", int.from_bytes(data, byteorder='big'))
    print("converted(little)", int.from_bytes(data, byteorder='little'))

客户端(来自PLC)

我将使用命令行。在

^{pr2}$

只要是1234就行了。在

NEXT>> 9
received data: b'\xd2\x04\x01\x00\x00\x00'
converted(big) 230914638479360
converted(little) 66770

它不起作用,在这个例子中是12340001。在

NEXT>> 11
received data: b'\xd2\x044\x12\x00\x00'
converted(big) 230915495297024
converted(little) 305398994

它不工作,结构本身也很奇怪。在


Tags: fromdatabytessocketconntcpdummyint
1条回答
网友
1楼 · 发布于 2024-09-30 16:29:13

好吧,最后的评论澄清了一切。您将这个整数编码为3个字(每个字2个字节)。以前,我做了一些测试,试图将值“解码”为64位int,因为123456789010x2DFDC1C35)不适合32位,但(显然)没有成功。在

根据[Python]: Format Characters,对于单词,我们有short对应者(我选择unsigned版本:H):

>>> import sys
>>> import struct
>>> sys.version
'3.5.4 (v3.5.4:3f56838, Aug  8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)]'
>>>
>>> data = b'\xd2\x04.\x16\xc5"'
>>> fmt = b"<HHH"
>>> parts = struct.unpack(fmt, data[:6])
>>> parts
(1234, 5678, 8901)
>>>
>>> # If you want to combine the 3 numbers into the original one:
...
>>> parts[0] * 100000000 + parts[1] * 10000 + parts[2]
123456788901

相关问题 更多 >