在运行C应用程序的嵌入式设备上,我定义了以下结构:
struct TestStruct
{
float first;
int second;
char third;
};应请求,我通过套接字发送此结构:
else if(strcmp(str, "Get Stru") == 0)
{
TestStruct testStruct;
testStruct.first = 1.2;
testStruct.second = 42;
testStruct.third = 'A';
INT32 sendDataLength = send(m_Socket, (char *)(&testStruct), sizeof(testStruct), 0);
}并从我桌面上的Python脚本中读取它:
import struct
import socket
from ctypes import *
class YourStruct(Structure):
_fields_ = [('v', c_float),
('t', c_int),
('c', c_char)]
s = socket.socket()
host = '127.0.0.1'
port = 1234
s.connect((host, port))
s.send('Get Stru'.encode())
data = s.recv(20)
print(data)
x = YourStruct()这是打印到我桌面上控制台的数据:

如何将data重新组装成YourStruct
请注意,嵌入式设备使用的是小endian,因此我不得不使用struct.unpack("<" + "f" * 2048, data)来重新组装浮点数数组。
发布于 2018-02-16 09:44:57
[Python.Docs]:struct -将字节解释为打包的二进制数据包含所有所需的信息。
code00.py
#!/usr/bin/env python
import ctypes as ct
import struct
import sys
class SampleStruct(ct.Structure):
_fields_ = (
("v", ct.c_float),
("t", ct.c_int),
("c", ct.c_char),
)
def main(*argv):
data = b"\x9a\x99\x99?*\x00\x00\x00A\xbe\xad\xde"
x = SampleStruct()
fmt = "<fic"
fmt_size = struct.calcsize(fmt)
x.v, x.t, x.c = struct.unpack(fmt, data[:fmt_size])
print("Fields\n v: {:f}\n t: {:d}\n c: {:s}".format(x.v, x.t, x.c.decode()))
if __name__ == "__main__":
print("Python {:s} {:03d}bit on {:s}\n".format(" ".join(elem.strip() for elem in sys.version.split("\n")),
64 if sys.maxsize > 0x100000000 else 32, sys.platform))
rc = main(*sys.argv[1:])
print("\nDone.")
sys.exit(rc)Notes
"<fic":float、int、char (前面是小endian标记)输出
cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q048822543> "e:\Work\Dev\VEnvs\py_pc064_03.07.09_test0\Scripts\python.exe“./code00.py Python3.7.9(标签/v3.7.9:13c94747c7,2020年8月17日,18:58:18) MSC v.1900 64位(AMD64) 064位( win32字段v: 1.200000 t: 42 c: a Done )。
https://stackoverflow.com/questions/48822543
复制相似问题