1

2つのシステムが通信できるようにしようとしています。C#アプリケーションがPythonで記述されたTCPサーバーとゴミ箱を話し合うようにしたいのです。

最初にシリアル化について考え、グーグルのprotobufをよく見てみました。ただし、複雑な型とデータ構造がある場合にのみシリアル化が必要になるわけではありません。私はしません。列挙型のみを送信したい(列挙型要素のデフォルトの基になる型は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()
4

2 に答える 2

1

列挙型を文字列として渡すだけでOKです。intメソッドを使用して、それらを整数に戻すことができます。

cmd = int(data);

16進バージョンが必要な場合は、以下を使用します。

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.
于 2012-08-05T11:35:31.040 に答える
0

そのシナリオでは、基になる値の4バイトのネットワークバイトオーダーチャンクを送信します。

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

そのためのバイトはさまざまな方法で取得できます。NetworkStream上のBinaryWriter、BitConverter、または単にシフト演算子かもしれません。次に、他の言語で同じ4バイトを読み取り、それらを整数として扱います。任意の言語で整数をイペナムにキャストできるはずです。あるいは、ビット演算子を使用するだけです。

于 2012-08-05T11:37:30.390 に答える