我目前正在编写一个使用Vala的应用程序,它要求我通过网络发送数据。为了帮助创建数据包(以及在以后的日期更新协议),我创建了一些结构,我将其作为void *传递给方法。这些结构代表了数据包的排列方式,并允许我非常容易地生成一个数据包,而不必过多地混淆。但问题是,GLib.OutputStream.write()的Vala包装器不接受计数(即使原始方法也是如此)。 Vala获取传递给它的uint8 []的大小并将其提供给原始方法。有没有一种简单的解决方法,没有编辑GIO vapi?可能是一种非常便宜的方式,在提供尺寸时向uint8 []投射空白*?我的目标是在这里获得非常高的性能,因为应用程序将需要同时维护数千个连接。提前感谢您的帮助。
〜迈克尔
答案 0 :(得分:1)
我一直在使用像这样的宏:
#define OBJECT_TO_BUFFER(val,type,size) (*(size) = sizeof(type), (guint8*)val)
解决这个问题。它接受您的对象并简单地返回与uint8[]
相同的内存。它在Vala中有相应的原型:
unowned uint8[] Buffer.of<T>(ref T @value);
标题文件和名为“技巧”的VAPI文件是in my GitHub。处理对象数组有类似的版本。
答案 1 :(得分:1)
unowned uint8[] buf = (uint8[]) your_real_buffer;
buf.length = the_length_you_want;
然后发送buf。