我试图将python程序转换为D;该程序用于发送Art-NetDMX包。在
Python:
import sys, socket, math, time
from ctypes import *
class ArtNetDMXOut(LittleEndianStructure):
PORT = 0x1936
_fields_ = [("id", c_char * 8),
("opcode", c_ushort),
("protverh", c_ubyte),
("protver", c_ubyte),
("sequence", c_ubyte),
("physical", c_ubyte),
("universe", c_ushort),
("lengthhi", c_ubyte),
("length", c_ubyte),
("payload", c_ubyte * 512)]
def __init__(self):
self.id = b"Art-Net"
self.opcode = 0x5000
self.protver = 14
self.universe = 0
self.lengthhi = 2
def main():
hostIP = "localhost"
S = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
packet = ArtNetDMXOut()
packet.payload[0] = 255
S.sendto(packet, (hostIP, ArtNetDMXOut.PORT))
if __name__ == "__main__":
main()
D:
^{pr2}$我的Python代码完全按照预期工作,但是在D中,s.send(packet);
行出现了错误function std.socket.Socket.send (const(void)[] buf, SocketFlags flags) is not callable using argument types (ArtNetDMX)
。在
我正确地处理这个问题吗?我做错什么了?在
对于初学者来说,您希望
ArtNetDMX
是struct
,而不是class
-因为D中的类是引用类型,并且不能保证类字段的布局;而且由于是通过网络发送的,请指定适当的对齐方式(如果每个字段都要打包在一起,则通常为1):在
^{pr2}$main
中,现在可以在堆栈上分配它的一个实例:或者,如果多次执行相同的初始化,请将其移到函数中:
最后,
Socket.send
要求它的参数是片(数组或的一部分)。如果一次发送多个数据包,则将数据包放入一个数组中,然后只发送该数组。在因为你只发送一个包,你可以替换
与
这只是将对象转换为单元素切片的安全方法。在
Dlang是强类型语言。所以你必须给套接字.send方法。您应该将对象(类型ArtNetDMX)转换为阵列。您可以使用Dlang struct进行直接对话:
有关包含此网络代码的字节代码,请参阅“序列号”(FYHTORT)
相关问题 更多 >
编程相关推荐