1

我已经在旧消息中搜索了答案,所以如果这是多余的,我深表歉意。我也应该说我是一个python新手。

我有一个 C# 应用程序,它使用 Newtonsoft 的 BSON 编码器对 XYZ 坐标的 double[][] 进行编码(每个点都有三个坐标,例如点 '0' 的 'x' 坐标是数组 [0] [0],'点 2 的 y' 坐标为 array[2][1])。然后使用 ZeroMQ 通过网络将这些坐标发送到 python 客户端。然后使用 PyMongo BSON 模块 ( https://github.com/mongodb/mongo-python-driver ) 对 BSON 数据进行解码。

我正在将结构化数据传递给 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]}

...字符串字典与双 []。因此,第一个索引被解释为字符串。我想:

数组[0][2]

...但是显示的数据结构需要:

数组[u'0'][2]

所以,总而言之,我希望一个 double[][] 到达 python,但一个 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 是双精度 [][]。

这是 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'

有任何想法吗?我是否需要设置一些标志来告诉编码器不要使用字符串字典?我正在尝试快速流式传输数据,因此我希望数据尽可能以最快、解释最少的形式出现,因此我希望不必一直将整数转换为字符串。

感谢您的任何帮助!

-丹尼-

更新:嗯,这是一个解决方法。我把我想要传输的所有二进制数据,包装在字典中并发送过来。字典只有一个条目 (dict["0"] = myData;)。然后我将它发送到 python,在那里我从第一个(也是唯一的)键中提取值,并将其传递给那些对我的小包装技巧并不明智的调用者。就像一个魅力,但它让我觉得有点奇怪。如果有人有更清洁、更正确的解决方案,我很想听听。

4

0 回答 0