首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过套接字将C-struct读入python

通过套接字将C-struct读入python
EN

Stack Overflow用户
提问于 2018-02-16 08:11:13
回答 1查看 5.7K关注 0票数 3

在运行C应用程序的嵌入式设备上,我定义了以下结构:

代码语言:javascript
复制
struct TestStruct
{
    float first;
    int second;
    char third;
};

应请求,我通过套接字发送此结构:

代码语言:javascript
复制
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脚本中读取它:

代码语言:javascript
复制
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)来重新组装浮点数数组。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-16 09:44:57

[Python.Docs]:struct -将字节解释为打包的二进制数据包含所有所需的信息。

code00.py

代码语言:javascript
复制
#!/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

  • 从从套接字接收数据(数据)的点开始
  • 传递给struct.unpack (fmt )的格式告诉它数据是如何组织的:在我们的示例中,它是"<fic":float、int、char (前面是小endian标记)
  • 还计算格式所需数据的大小(以字节为单位):它是9 (4 +4+ 1)。数据有12个字节,所以忽略最后3个字节,否则struct.unpack会吐出struct.error
  • 有关[SO]:Python ()行为的更多详细信息,请查看struct.pack

输出

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 )。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48822543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档