2012-08-05 28 views
1

我試圖讓兩個系統進行通信,我希望我的C#應用​​程序與用Python編寫的TCP服務器交談垃圾。如何發送一個枚舉到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

你正在混淆十六進制python文字int表示法,並將一個字節編碼爲十六進制表示。 *它們不是同一件事*。我已經在[前一個問題](http://stackoverflow.com/q/11791161/)中告訴過你結構模塊。 – 2012-08-05 11:34:57

回答

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. 
+0

爲什麼你想要十六進制版本?這表明將其視爲*字符串*,通常只需要*字節*。 – 2012-08-05 11:50:10

0

在這種情況下,我只想送潛在價值的4個字節的網絡字節順序塊,即

RobotCommands cmd = ... 
int i = (int) cmd; 

你可以通過很多方式獲得這些字節;也許是NetworkStream上的BinaryWriter,也許是BitConverter,或者也許只是換班操作員。然後用另一種語言讀取相同的4個字節,並將它們視爲整數。您應該能夠將整數轉換爲任何語言的ipenum,或者可以使用按位運算符。

相關問題