c++protobuf(c++protobuf可以解析数据不对)
本篇文章给大家谈谈c++protobuf,以及c++protobuf可以解析数据不对对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、protobuf 怎么查看版本
- 2、mac下怎么装protobuf-c-compiler
- 3、protobuf动态解析
- 4、protobuf 可以用c语言吗
- 5、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可以解析数据不对的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。