![]() |
1
68
我来参加聚会有点晚了,但是下面的实现包括其他答案中缺少的一些优化,并且在64MB输入之后不会失败(尽管它仍然强制 the 64MB limit 在每个单独的消息上,而不是在整个流上)。 (我是C++和JavaOrthBuf库的作者,但我不再为谷歌工作了。很抱歉,这段代码从未进入官方库。这就是它如果有的话的样子。)
|
![]() |
2
17
好的,所以我还没有找到实现我所需要的顶级C++函数,但是通过Java API引用的一些拼写发现如下 MessageLite 接口:
因此,Java大小前缀是(协议缓冲区)VARTET! 通过这些信息,我通过C++ API挖掘并找到了 CodedStream 标题,其中包括:
使用这些,我应该能够滚动自己的C++函数来完成这项工作。 他们确实应该把它添加到主消息API中,考虑到Java有它的功能缺失,Marc Gravell优秀的原Buffnet NET C端口也是如此(通过SerialZeIn RealthPiFixE和DeXialIZE.LangthPosiFiX)。 |
![]() |
3
12
我使用codedoutputstream/arrayoutputstream编写消息(使用大小),并使用codedinputstream/arrayinputstream读取消息(使用大小)。 例如,以下伪代码将消息大小写在消息后面:
在编写时,还应该检查缓冲区是否足够大,以适合消息(包括大小)。在阅读时,您应该检查缓冲区是否包含一个完整的消息(包括大小)。 如果他们将方便的方法添加到类似于Java API提供的C++ API中,那肯定会很方便。 |
![]() |
4
7
我在C++和Python中都遇到了同样的问题。 对于C++版本,我使用了在这个线程上发布的代码Kton瓦尔达和从他发送到ToBuFF团队的拉请求的代码(因为这里发布的版本不处理EOF,而他发送给Github的版本)。
下面是我的python2实现:
它可能不是最漂亮的代码,我相信它可以被重构一点,但至少这可以向您展示一种实现它的方法。 现在的大问题是 缓慢的 . 即使在使用Python原型BuffF的C++实现时,它也比纯C++慢一个数量级。我有一个基准测试,我从一个文件中读取10M条大约30字节的protobuf消息。在C++中使用0.9s,在Python中使用35s。 使其更快的一种方法是重新实现varint解码器,使其从文件中读取并一次性解码,而不是像当前的代码那样从文件中读取然后解码。(分析显示变量编码器/解码器花费了大量时间)。但不用说,仅仅是不足以缩小Python版本和C++版本之间的差距。 任何加快速度的想法都是受欢迎的:) |
![]() |
5
6
干得好:
|
![]() |
6
6
iTestPixStand对EOFS非常脆弱,与STD:ISTRAMAM一起使用时容易发生的其他错误。在此之后,protobuf流将永久损坏,并且任何已使用的缓冲区数据都将被销毁。对从Protobuf中的传统流中读取数据有适当的支持。
实施
在实践中,解析调用以
下面是一个用于ASIO同步流的示例( SyncReadStream / SyncWriteStream ):
用途:
|
![]() |
7
3
也在寻找解决方案。这里是我们解决方案的核心,假设一些Java代码编写了许多MyScript消息
if(someCodedInputStream->ReadVarint32(&bytes)) { CodedInputStream::Limit msgLimit = someCodedInputStream->PushLimit(bytes); if(myRecord->ParseFromCodedStream(someCodedInputStream)) { //do your stuff with the parsed MyRecord instance } else { //handle parse error } someCodedInputStream->PopLimit(msgLimit); } else { //maybe end of file } 希望有帮助。 |
![]() |
8
0
使用一个目标C版本的协议缓冲区,我遇到了这个确切的问题。在从iOS客户端发送到使用基于PARSEDLIMIDEDO的Java服务器时,该服务器希望将长度作为第一字节,首先需要调用WraveAdWEnter到CODIDOutPutsFipe。在这里张贴希望帮助其他人遇到这个问题。在解决这个问题的过程中,有人会认为Google Proto Bufs会带有一个简单的标志,它可以为您做到这一点…
|
![]() |
9
0
因为我不被允许写这篇文章作为对肯顿·瓦尔达上述答案的评论;我相信他发布的代码(以及其他已经提供的答案)中有一个错误。以下代码:
设置错误的限制,因为它不考虑已从输入中读取的变量32的大小。这可能会导致数据丢失/损坏,因为从可能是下一条消息的一部分的流中读取额外的字节。正确处理此问题的通常方法是删除用于读取大小的codedinputstream,并创建一个新的用于读取有效负载的codedinputstream:
|
![]() |
10
-6
可以使用getline从流中读取字符串,使用指定的分隔符:
(在标题中定义) |
![]() |
coolk · 如何使protobuf不区分大小写? 7 年前 |
![]() |
Lolo · 如何解析protobuf文件中缺少引号的字符串字段? 7 年前 |
![]() |
Cae Vecchi · 在自己的proto上导入供应商proto 7 年前 |
![]() |
mbalug · 为ARM编译c++源代码 7 年前 |
![]() |
FraserOfSmeg · 使用。vb中的proto文件。网 7 年前 |