1

古いメッセージで回答を検索したので、これが冗長である場合はお詫び申し上げます。また、私は Python の初心者です。

Newtonsoft の BSON エンコーダーを使用して XYZ 座標の double[][] をエンコードする C# アプリがあります (各ポイントには 3 つの座標があります。たとえば、ポイント '0' の 'x' 座標は配列 [0][0]、'点 2 の y' 座標は配列 [2][1]) です。これらの座標は、ZeroMQ を使用してネットワーク経由で Python クライアントに送信されます。BSON データは、PyMongo BSON モジュール ( https://github.com/mongodb/mongo-python-driver ) を使用してデコードされます。

構造化データを python に取得していますが、C# の double[][] は python で次のように表示されます

{u'1': [3.227, 0.0, 0.0], u'0': [4.081, 0.0, 0.0], u'2': [2.845, 0.0, 0.0]}

... 文字列と double[] の辞書。したがって、最初のインデックスは文字列として解釈されています。私が欲しい:

配列[0][2]

...しかし、表示されるデータ構造には次が必要です。

配列[u'0'][2]

つまり、要約すると、python に double[][] が到着するようにしたいのですが、代わりに Dictionary が到着しています。私は何を間違っていますか?

https://pypi.python.org/pypi/bson/0.3.2の BSON コーデックを使用してこの同じデータをデコードしたところ、まったく同じ結果が得られたので、何が起こっていても、少なくとも一貫性があります。

私のC#コードはこれです:

static public byte[] Encode<T>(object obj)
    {
        MemoryStream memstr = new MemoryStream();
        using (BsonWriter writer = new BsonWriter(memstr))
        {
            JsonSerializer serializer = new JsonSerializer();
            serializer.Serialize(writer, obj,typeof(T));
        }

        var retval = memstr.ToArray();
        return retval;
    }

そして、私はそれを次のように呼びます:

byte[] reply = Streamer.Encode<double[][]>(mCoords);

... mCoords は double[][] です。

これは、Python がネットワーク経由で受信するバイナリ データです。

'\x80\x00\x00\x00\x040\x00&\x00\x00\x00\x010\x00m\xe7\xfb\xa9\xf1R\x10@\x011\x00\x00\x00\x00\x00\x00\ x00\x00\x00\x012\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04‌ 1\x00&\x00\x00\x00\x010\x007\x89A`\xe5\xd0 \t@\x011\x00\x00\x00\x00\x00\x00\x00\x0‌ 0\x00\x012\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x042\ x00&\x00\x00\x00\x010\x00‌\xc3\xf5(\\x8f\xc2\x06@\x011\x00\x00\x00\x00\x00\x00\x00\x00\x00\x012\x00\ x00\x00\‌ x00\x00\x00\x00\x00\x00\x00\x00'

何か案は?文字列辞書を使用しないようにエンコーダーに指示するフラグを設定する必要がありますか? データをすばやくストリーミングしようとしているので、データをできるだけ高速で解釈の少ない形式で表示したいので、常に int を文字列に変換する必要がないようにしたいと考えています。

助けてくれてありがとう!

-デニー-

更新: さて、ここに回避策があります。転送したいすべてのバイナリ データを取得し、それを辞書にラップして送信します。ディクショナリには 1 つのエントリしかありません (dict["0"] = myData;)。次に、それを python に送り、そこで最初の (そして唯一の) キーから値を抽出し、それを呼び出し元にスタックに渡します。魔法のように機能しますが、少し奇妙に感じます。誰かがよりクリーンで正しい解決策を持っている場合は、ぜひ聞いてください。

4

0 に答える 0