我在旧邮件中搜索了答案,所以如果这是多余的,我会道歉。我还应该说我是一个蟒蛇新手。
我有一个C#应用程序正在使用Newtonsoft的BSON编码器来编码XYZ坐标的双[] [](每个点有三个坐标,例如点'0'的'x'坐标是数组[0] [0] ,第2点的'y'坐标是数组[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]}
...字符串与double []的字典。因此,第一个索引被解释为字符串。我想要:
阵列[0] [2]
...但显示的数据结构需要:
阵列[u'0' ] [2]
因此,总而言之,我想要一个double [] []到达python但是字典到达了。我做错了什么?
我使用来自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 \吨@ \ 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'
有什么想法吗?我是否需要设置一些标志来告诉编码器不使用字符串字典?我正在尝试快速传输数据,所以我希望数据尽可能以最快,最少解释的形式出现,因此我希望不必一直将整数转换为字符串。
谢谢你的帮助!
-denny -
更新: 好吧,这是一个解决方法。我将所有要传输的二进制数据包装在一个字典中并将其发送出去。字典只有一个条目(dict [“0”] = myData;)。然后我将它发送到python,在那里我从第一个(也是唯一的)密钥中提取值,然后将其传递给那些对我的小包装技巧更聪明的调用者。像魅力一样,但它让我感到有点怪异。如果有人有更清洁,更正确的解决方案,我很乐意听到。