c++protobuf(c++protobuf可以解析数据不对)

本篇文章给大家谈谈c++protobuf,以及c++protobuf可以解析数据不对对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

protobuf 怎么查看版本

protobuf版本需要在protobuf程序中查看。

在protobuf程序中查看版本步骤如下所示:

1、点击打开计算机,进入分区列表。

2、在计算机分区列表中选择protobuf程中伏笑序所在的文卖含件夹。

3、点击打开protobuf程序。厅亩

4、如图所示在protobuf程序中,即可完成protobuf版本查看。

[img]

mac下怎么装protobuf-c-compiler

首先是怎么安装Protobuf。 来自的文档。

打开终端!

brew -v

查看你的mac里面有没有装brew。brew是mac os里面,类似于ubuntu的apt-get的功能,都可以直接在终端输入命令然后安装程序。-v自然就是版本version的意思

ruby -e $(curl -fsSL )

这一句半懂不懂,大概就是利用curl工具访问那个url,然后在ruby环境下载安装brew

建议先去Homebrew官网找最新的下载地址

brew install automake

brew install libtool

brew install protobuf

就是利用brew下载安装了。protobuf就是我们想要的,另外两个是依赖库

git clone

./build.sh

从github下载protobuf-objc这个工程,build脚本里面做的是伍伏斗编译。

我建议不要用 ./build.sh ,我安装过程中发现未知错误最终没有进行下去。哎,好失败。懂脚本的朋友可以尝试下。

到此,我们先得感谢 的文章作者。点开链接的朋友会发现,这都什么吗,明显照抄人家的。。。

我只能说,该作者前半部分解释的非常好,我是超越不了了,只能完全借用了。其实厅斗说白了,就是懒。言归正传:

当我们 git clone 完成后,

cd ~/protobuf-objc

./autogen.sh

./configure

~/protobuf-objc其实就是刚刚clone的文件目录

进行./configure 可能会报错,不过别着急,先分析错误信息

configure: error:

ERROR: protobuf headers are required.

You must either install protobuf from google,

or if you have it installed in a custom location

you must add '-Iincludedir' to CXXFLAGS

and '-Llibdir' to LDFLAGS.

If you did not specify a prefix when installing

protobuf, try

'./configure CXXFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib'

In some 64-bit environments, try LDFLAGS=-L/usr/local/lib64.

仔细看,不难发现腔磨终端给出了解决办法,我想这应该是跟系统是不是64位有关吧(个人猜测)。

./configure CXXFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib

运行通过后,

make

make install

protobuf动态解析

enum command

{

// 登漏前录请求

CMD_LOGIN_RSP = 502 [(message_name) = "LoginRsp"];

}

extend google.protobuf.MessageOptions

{

}

// CMD_LOGIN_REQ = 501

message LoginReq

{

option (gateproto.protocolid) = CMD_LOGIN_REQ;

required string account = 1;

required string name = 2;

required bytes token = 3;

required uint64 roleid = 4;

required uint32 is_reconnect = 5[ default = 0];

optional uint32 imgid = 6[ default = 0];

optional string device_id = 7;

}

using namespace std;

using namespace google::protobuf;

using namespace google::protobuf::compiler;

using namespace google::protobuf::internal;

static DiskSourceTree srctree_;

static Importer *importer_;

static DynamicMessageFactory MsgFactory_;

struct MsgDesc

{

const FileDescriptor *filedesc;

const Descriptor *desc;

const Message *prototype;

};

std::mapstring, MsgDesc * descmap_;

std::vector MsgDesc * vecDesc_;

const FieldDescriptor * protocolid_des;

class FileErrorCollector : public MultiFileErrorCollector {

public:

void AddError(const string filename, int line, int column,

const string message)

{

cout filename endl;

cout line endl;

cout 返棚清 column endl;

cout message 和历 endl;

}

};

void AddSearchPath(vectorstring paths)

{

for (size_t i = 0; i paths.size(); i++)

{

srctree_.MapPath("", paths[i]);

}

FileErrorCollector err;

importer_ = new Importer(srctree_, err);

}

void AddMsgDesc(const string proto_file)

{

const FileDescriptor *file_desc = importer_-Import(proto_file);

int count = file_desc-message_type_count();

if (count = 0)

return;

int extensiopn_couny = file_desc-extension_count();

printf("extensiopn_couny type: %d\n", extensiopn_couny);

for (int i = 0; i extensiopn_couny; i++)

{

const FieldDescriptor * msg_desc = file_desc-extension(i);

printf("extension type: %s\n", msg_desc-name().c_str());

printf("extension cpp type: %s\n", msg_desc-cpp_type_name());

printf("extension type: %s\n", msg_desc-type_name());

if ( msg_desc-name() == "protocolid")

{

protocolid_des = msg_desc;

}

}

// string key = proto_file.substr(0, proto_file.find_last_of("."));

for (int i = 0; i count; i++)

{

const Descriptor * msg_desc = file_desc-message_type(i);

printf("message type: %s\n", msg_desc-name().c_str());

MsgDesc *msgdesc = new MsgDesc;

msgdesc-filedesc = file_desc;

msgdesc-desc = msg_desc;

msgdesc-prototype = MsgFactory_.GetPrototype(msg_desc);

descmap_[msg_desc-name()] = msgdesc;

printf("message type: %s\n", msg_desc-options().DebugString().c_str());

/*bool m = msg_desc-options().GetExtension(gateproto::protocolid);

if (m) {

printf("message type: %s\n", msg_desc-name().c_str());

vecDesc_.push_back(msgdesc);

}*/

}

}

void SendGsRandomMessage()

{

uint32_t index = 10;

auto iter = descmap_.find("EnterPvePassReq");

if (iter!= descmap_.end() ){

printf("SendGsRandomMessage");

MsgDesc *msgdesc = iter-second;

Message *msg = msgdesc-prototype-New();

printf("SendGsRandomMessage field count type: %d\n",msg-GetDescriptor()-field_count());

printf("SendGsRandomMessage extension count type: %d\n",msg-GetDescriptor()-extension_count());

printf("SendGsRandomMessage one count type: %d\n",msg-GetDescriptor()-oneof_decl_count());

printf("SendGsRandomMessage enum count type: %d\n",msg-GetDescriptor()-enum_type_count());

const Descriptor * option_Desc = msg-GetDescriptor()-options().GetDescriptor();

for (int i=0;ioption_Desc-field_count();i++) {

const FieldDescriptor * filed_des = option_Desc-field(i);

printf("FieldDescriptor type: %s\n", filed_des-name().c_str());

}

for (int i=0;imsg-GetDescriptor()-field_count();i++) {

const FieldDescriptor * filed_des = msg-GetDescriptor()-field(i);

printf("FieldDescriptor type: %s\n", filed_des-name().c_str());

}

MessageOptions msgop= msg-GetDescriptor()-options();

const ::google::protobuf::UnknownFieldSet unset = msgop.unknown_fields();

for (int i=0;iunset.field_count();i++) {

UnknownField filed = unset.field(i);

printf("UnknownField %d",filed.varint());

}

}

}

int main(int argc, char *argv[])

{

vectorstring v;

v.push_back("../protocol");

v.push_back("../include");

AddSearchPath(v);

AddMsgDesc("gate.pb/gate.proto");

AddMsgDesc("rank.pb/rank.proto");

AddMsgDesc("immortaldb.pb/immortaldb.proto");

AddMsgDesc("dbproxy.pb/dbproxy.proto");

AddMsgDesc("online.pb/online.proto");

AddMsgDesc("login.pb/login.proto");

SendGsRandomMessage();

return 0;

}

/pre

protobuf 可以用c语言吗

据说可以用protobuf-c来做,它兼容C的格式。具体的薯辩你多去这方面拍核的数贺缺专业网站浏览,咨询里面的人,应该会有人回复你的。

protobuf 怎么读取二进制文件

有两种方式,哪滑一是逗蚂直接使用C++版, 引用.h和dylib就可以了, 用在64位的5s上很容易,但是在5以下山缓埋的32位上编译环不容易弄对。 二是用objc版的。可以参考如下操作: 1,下载ProtocolBuffer包,并按照包中根目录下README.txt安装。 make install后,...

关于c++protobuf和c++protobuf可以解析数据不对的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表