【问题标题】:How to convert data which is received from udp to ctype struct in Python?python - 如何将从udp接收到的数据转换为Python中的ctype struct?
【发布时间】:2014-03-17 10:32:26
【问题描述】:

我正在使用 Python 2.7.6 ctypes 结构:

class TestStruct(Structure):
   _fields_=[
          ("ValueA",c_int),
          ("StringA",c_char*9)
          ]

我像这样从 udp 获取数据:

    sock = socket.socket(socket.AF_INET,
                         socket.SOCK_DGRAM)
    sock.bind((self.__ip,self.__port))
    print("Starting Receiving......")
    while True:
        try:
            (data,addr) = sock.recvfrom(1024)
            t = cast( data, POINTER(TestStruct))
            print t.ValueA
            #print(data[0])
            #print(type(data))
        except Exception,ex:
            print ex
            break

如您所见,我使用的是“cast”,但它转换的类型类似于:“ma​​in.LP_TestStruct”。

我想要的是 TestStruct 对象,我应该使用什么函数? 谢谢!

【问题讨论】:

  • 尝试t1 = t.contents 然后print t1.ValueA
  • 我对python不熟悉,我去理解你在说什么。你能给我一些参考吗?谢谢

标签: python byte tuples ctypes typeconverter


【解决方案1】:

您可以使用t.contents 来获取指针指向的对象(TestStruct)。但我想你最好为此使用 Python 的 struct 模块(正如@eryksun 提到的那样)。

【讨论】:

  • 它看起来很丑,想象有很多这样的结构。在 c/c++ 中,我们可以只写代码: TestStruct test = (TestStruct)bytesBuf;
  • 好的,我明白了。谢谢@Aleksandar!我可以通过使用代码“t.contents.ValueA”来获取“TestStruct”对象!
  • 强制转换不可变字符串不是一个好主意。使用t = TestStruct.from_buffer_copy(data)。您可能还想用_pack_ = 1 定义结构以禁用本机对齐,如果int 处于网络顺序,则可能需要BigEndianStructure
  • 或者直接使用ValueA, StringA = struct.unpack('>i9s', data)
  • 感谢@eryksun TestStruct 类型的数据会被多次接收,所以我认为 struct.unpack(...) 不能满足我的效率太低。你能告诉我函数“from_buffer_copy”在哪里定义吗?现在我使用代码: t = copy.deepcopy( cast( data, POINTER(TestStruct)).contents)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-07
  • 2023-03-22
  • 1970-01-01
  • 2013-04-30
  • 2016-11-01
  • 1970-01-01
相关资源
最近更新 更多