我正在尝试让两个系统进行通信,我希望我的C#应用程序能够与使用Python编写的TCP服务器进行对话。
首先我想到了序列化,并仔细研究了google的protobuf。但是,如果您有复杂的类型和数据结构,那么您是否只需要序列化。我不。我只想发送enum(枚举元素的默认底层类型是int(有符号32位整数)。)。
但定义的枚举相当大(C#):
[Flags]
public enum RobotCommands
{
reset = 0x0, // 0
turncenter = 0x1, // 1
turnright = 0x2, // 2
turnleft = 0x4, // 4
standstill = 0x8, // 8
moveforward = 0x10, // 16
movebackward = 0x20,// 32
utility1on = 0x40, // 64
utility1off = 0x80, // 128
utility2on = 0x100, // 256
utility2off = 0x200 // 512
}
真的,我需要序列化吗? Python能够读取我发送的枚举的最简单方法是什么?
我尝试将其作为字符串发送,希望将它们转换回来,但它们似乎是字符串:
#!/usr/bin/env python
import socket
TCP_IP = '192.168.1.66'
TCP_PORT = 30000
BUFFER_SIZE = 20 # Normally 1024, but we want fast response
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connection address:', addr
while True:
data = conn.recv(BUFFER_SIZE).encode("hex")
print "received data:", data
if( (data & 0x8) == 0x8 ):
print("STANDSTILL");
if not data: break
conn.send(data)
conn.close()
答案 0 :(得分:1)
将枚举作为字符串传递即可。您可以使用int
方法将它们恢复为整数。
cmd = int(data);
如果您想要十六进制版本,请使用:
cmd = hex(int(data))
int(x[, base]) -> integer
Convert a string or number to an integer, if possible. A floating point
argument will be truncated towards zero (this does not include a string
representation of a floating point number!) When converting a string, use
the optional base. It is an error to supply a base when converting a
non-string. If base is zero, the proper base is guessed based on the
string content. If the argument is outside the integer range a
long object will be returned instead.
hex(number) -> string
Return the hexadecimal representation of an integer or long integer.
答案 1 :(得分:0)
在那种情况下,我只会发送一个基础值的4字节网络字节顺序块,即
RobotCommands cmd = ...
int i = (int) cmd;
你可以通过多种方式获取字节数;可能是NetworkStream上的BinaryWriter,可能是BitConverter,也可能只是shift-operators。然后用你的另一种语言读取相同的4个字节,并将它们视为整数。您应该能够使用任何语言将整数转换为ipenum,或者:只使用按位运算符。