Cap'n Proto - 在 Java 中查找消息大小
Cap'n Proto - Finding Message Size in Java
我正在使用TCP客户端/服务器从c++发送Cap'n Proto消息到Java。
有时接收缓冲区可能是满的或未满的,为了处理这些情况,我们需要知道消息的大小。
当我在Java中检查缓冲区的大小时,我得到208字节,但是调用
MyModel.MyMessage.STRUCT_SIZE.total()
返回4(不确定这里使用的是什么度量单位)。
我注意到4能被208整除52倍。但我不知道使用52会有什么显著的转换系数。
如何在Java中检查消息大小?
MyMessage.STRUCT_SIZE
表示该结构体本身的常量大小(以8字节的单词衡量),但如果该结构体包含非平凡字段(如Text, Data, List或其他结构体),则这些字段也占用空间,并且它们占用的空间量不是常量(例如,Text将根据字符串的长度占用空间)。
一般来说,您应该尝试让Cap'n Proto直接写入/读取适当的ByteChannel
,这样您就不必自己跟踪大小。但是,如果您确实必须提前计算消息的大小,您可以这样做:
ByteBuffer[] segments = message.getSegmentsForOutput();
int total = (segments.length / 2 + 1) * 8; // segment table
for (ByteBuffer segment: segments) {
total += segment.remaining();
}
// now `total` is the total number of bytes that will be
// written when the message is serialized.
在c++大小上,您可以使用serialize.h
中的capnp::computeSerializedSizeInWords()
(并乘以8)。
但是,你真的应该通过使用org.capnproto.Serialize
的方法和流I/o来构建你的代码来避免这种情况。
相关文章:
- 正在查找文档以获得PS4平台的C++中的设备信息
- 在C++中查找文件
- 模板元程序查找相似的连续类型名称
- 在UNIX系统中使用DIR查找文件的字节大小
- 查找最接近的大于当前数字的数字的索引
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 查找后更改类变量
- 使用正则表达式regex_search在字符串中查找字符串
- 使用gcc从静态链接的文件中查找可选符号
- 在C++中查找范围的长度
- 在java中解决这段代码时面临循环中的问题
- 算法问题:查找从堆栈中弹出的所有序列
- 尝试用java代码编译和运行c++代码
- 在Windows中查找扬声器输出的当前音量级别
- 查找表示 GPS 路线的两条线(MATLAB、Java、C++ 或 Python)之间的距离
- 如何使用本机代码以编程方式查找Java本地变量的内存地址
- 使用JNI在.jar中查找Java类
- Java JNI符号查找错误
- 如何查找Java + JNI + c++进程中的内存泄漏
- Cap'n Proto - 在 Java 中查找消息大小