tobu

阅读 / 问答 / 标签

go的protobuf这个问题是不是一个bug

客户端lua,通信协议是protobuf,以前用网易的proto-gen-lua,使用过程遇到些问题需要绕,比如: 1、每次更改、增加proto都要生成新的文件,代码规模剧增 2、由于lua本身,每个文件最大文件内全局local变量不能超过200个,所以当proto规模太大时。

如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信

1.下载protobuff,我下的是2.3.0版本最新的protobuf可以到Google Code上下载:http://code.google.com/p/protobuf/downloads/list当前版本为2.3.0,下载两个压缩包:protoc-2.3.0-win32.zip和protobuf-2.3.0.zip,前者是protobuf的编译器,后者包含了有三程序语言的开发包。 2.解压首先解压protoc-2.3.0-win32.zip,把protoc.exe文件放到path路径中,最简单的做法就是把这个文件拷贝到C:/WINDOWS目录下。解压protobuf-2.3.0.zip文件,将文件加压到C盘根目录,主文件位于C:/protobuf-2.3.0/protobuf-2.3.0目录下。 3.安装操作(1)使用VS2005编译proto,VS工程目录位于vsprojects目录中,工程名字为“protobuf.sln”。 (2)选择“生成”à“生成解决方案”选项进行编译,编译过程中可能会由于编译的顺序报错误,可以使用手工逐个顺序编译生成,可能会比较顺利。按照下图的顺序,右键“重新生成”,逐个编译。但是我在实习操作过程中,libprotobuf-lite工程重来都没有成功编译通过过。淡定先,这个不会影响大局的。(3)编译完成会在目录vsprojects下的Debug目录中生成lib和exe文件。生成清单如下:exe文件:2010-04-15 09:51 950,272 lite-test.exe2010-04-15 09:50 3,219,456 protoc.exe2010-04-15 09:48 9,228,288 tests.exe2010-04-15 09:56 2,519,040 test_plugin.exe lib文件:2010-04-15 09:50 2,685,922 libprotobuf-lite.lib2010-04-15 09:56 24,100,794 libprotobuf.lib2010-04-15 09:56 17,302,068 libprotoc.lib其实我在测试过程中,lite-test.exe和libprotobuf-lite.lib并没有生成,因为编译错误了,但这并不影响大局,淡定先。 (4)OK,至此,我们已经完成了编译工作,下面需要进行的是protobuf的测试。我们需要使用到之前VS编译出来的libprotobuf.lib和libprotoc.lib完成一个C/S结构的SOCKET通信测试。 àProtobuf的测试在VS2005下,创建两个新的工程,分别命名为server和client,每个工程都需要引用protobuf的头文件和lib文件。一、添加protobuf头文件操作:右击项目à属性à配置属性àC/C++à常规 (也命令行可在中添加)。具体路径:C:/protobuf-2.3.0/protobuf-2.3.0/src二、添加protobuf的lib文件操作:右击项目à属性à配置属性à链接器à常规(也可在命令行中添加)。具体路径:C:/protobuf-2.3.0/protobuf-2.3.0/vsprojects/Debug三、CMD窗口下编译生成头文件:C:/protobuf-2.3.0/protobuf-2.3.0/examples>protoc -I=./ --cpp_out=./ people.proto将proto文件生成的文件放到当前目录。

解决protobuf忽略空返回值的问题

最近在用Kratos开发项目的时候遇到了问题,repeated类型的字段在值为空的情况下,字段被直接忽略掉了。 我希望的是即使为空的情况下也能返回一个空数组,而不是直接把整个字段忽略掉,就像下面这样: 经过多方排查之后找到了问题所在,google会在生成pb.go文件时在json标签里插入 omitempty 属性,而json库在转换json时一旦遇到这个标签就会忽略掉空字段,这不符合我的需求,所以把这个字段去掉就好了。 先写一个shell脚本来递归遍历api目录下的pb.go文件: 接着修改Makefile文件: 在api的最下面添加替换脚本,流程就是遍历scandir脚本查出来的pb.go文件,替换掉文件里所有的omitempty,然后将文件暂存为.tmp,最后再覆盖原文件。 今后每次执行make api时就会连带自动替换掉所有生成文件中的omitempty,免得每次手动替换麻烦又容易出错。 参考: https://ld246.com/article/1591110788411

如何对 protobuf-lite编程,c++ android

protocol buffer编译器生成 Foo 类,公开地(publicly)派生自 google::protobuf::Message。Foo类是一个实体类;禁止遗留下纯虚的方法没有被实现。除了 Message 中的虚方法之外,非纯虚的方法可以由 Foo 类重载也可以不重载,取决于优化模式。缺省,为了最高的速度, Foo 实现特定protocol buffer版本的所有方法。不管怎样,如果 .proto 文件包含下列行:1 option optimize_for = CODE_SIZE;Foo 将仅重载运行必需的最小方法集合,和依赖于基于反射实现的剩余部分。这意味着减小了生成代码的大小,但也减小了性能。或者,如果 .proto 文件包含:1 option optimize_for = LITE_RUNTIME;Foo 将包含所有方法的快速实现(fast implementations),但是是实现 google::protobuf::MessageLite 接口,仅包含 Message 中所有方法的一个子集。尤其,它不支持描述符(descriptors)或反射。不管怎样,以这种方式生成的代码只需要连接 libprotobuf-lite.so (Windows上是 libprotobuf-lite.lib) 而不是 libprotobuf.so(libprotobuf.lib)。"lite"库比 "full"库(完整的库)要小很多,更适用于资源受限的系统,比如手机。你不应该创建 Foo 的子类。如果你子类化 Foo ,并且重载虚方法,重载可能被忽略,就像很多生成的方法为了提高性能被去虚拟化(de-virtualized)。

protobuf 生成的变量会不会自动销毁

要看具体变量的类型,看个例子吧:在网络游戏中,游戏玩家之间的同步是一个最基本的功能,而同步是通过对坐标的广播进行的,因此我们假设一个简单的模型,当一个玩家的位置发生变化时,将玩家的新位置发给地图内所有玩家,根据这个情况写出以下proto文件。message PlayerPos{ required uint32 playerID = 1; required float posX = 2 ; required float posY = 3 ;}这样就有一个问题,现在的游戏都是3D游戏,因此需要xyz来表示位置,还需要另一组xyz来表示朝向,如果用简单变量的话就会显的很乱,而且无论是位置还是朝向其实都是一组xyz,因此可以将xyz抽出来成为一个复合数据类型,单独放在一个文件中。这样就构成以下文件。file vector.protomessage vector3D{required float x = 1;required float y = 2;required float z = 3;};file Player.protoimport "vector.proto";message PlayerPos {required uint32 playerID = 1;required vector3D pos = 2;};编译的时候先编译vector文件,采用import时需要注意路径,本例中两文件在同一目录下。protoc --cpp_out=. vector.proto Player.protoproto对应的文件已经生成了,但是该怎么赋值呢,查API查了半天有点不知所以,干脆来看生成的类文件的源代码吧 // required uint32 playerID = 1; inline bool has_playerid() const; inline void clear_playerid(); static const int kPlayerIDFieldNumber = 1; inline ::google::protobuf::uint32 playerid() const; inline void set_playerid(::google::protobuf::uint32 value); // required .vector3D pos = 2; inline bool has_pos() const; inline void clear_pos(); static const int kPosFieldNumber = 2; inline const ::vector3D& pos() const; inline ::vector3D* mutable_pos(); inline ::vector3D* release_pos(); inline void set_allocated_pos(::vector3D* pos);上面列出了生成的部分源代码,主要是PlayerPos的操作变量的函数,第一个playID很简单,可以看到直接使用set_playerid ( ) 即可,但是对于嵌套的pos 发现没有对应的set_pos方法,不过发现了一个set_allocated_pos() 函数,这个函数也是set开头的,看看这个函数是干嘛的。 inline void PlayerPos::set_allocated_pos(::vector3D* pos) { delete pos_; pos_ = pos; if (pos) { set_has_pos(); } else { clear_has_pos(); }}看上去可以赋值,直接调用set_allocated_pos() 进行赋值看一看PlayerPos player;vector3D tmp;tmp.x = 1;tmp.y = 2;tmp.z = 3;player.set_allocated_pos(&tmp)编译没问题,但是运行时出现错误,而且是很奇怪的错误,仔细了查看一下PlayerPos的源码,发现一个问题::vector3D* pos_; ::google::protobuf::uint32 playerid_;上面是PlayerPos中变量的保存形式,发现pos是作为一个指针存储的,如果按照之前的赋值 tmp 是一个局部变量,函数返回时局部变量自动销毁,而pos_保存的仍然是已被销毁的tmp的位置,因此会出错,如果采用new的话就可以解决这个问题,即赋值方法如下PlayerPos player;vector3D *tmp = new Vector3D;tmp->x = 1;tmp->y = 2;tmp->z = 3;player.set_allocated_pos(tmp)这样即可,编译运行都没有问题。如此之外,还有一种赋值方法,就是调用mutable_pos()inline ::vector3D* PlayerPos::mutable_pos() { set_has_pos(); if (pos_ == NULL) pos_ = new ::vector3D; return pos_;}mutable_pos () 中自己new出了一个vector3D 对象,而vector3D中又实现了赋值的重载,因此可以这样解决PlayerPos player;vector3D *tmp = player.mutable_pos();tmp->x = 1;tmp->y = 2;tmp->z = 3;

为什么Protobuf的默认序列化格式没有包含消息的长度与类型

Protobuf 是经过深思熟虑的消息打包方案,它的默认序列化格式没有包含消息的长度与类型,自然有其道理。哪些情况下不需要在 protobuf 序列化得到的字节流中包含消息的长度和(或)类型?我能想到的答案有:如果把消息写入文件,一个文件存一个消息,那么序列化结果中不需要包含长度和类型,因为从文件名和文件长度中可以得知消息的类型与长度。如果把消息写入文件,一个文件存多个消息,那么序列化结果中不需要包含类型,因为文件名就代表了消息的类型。如果把消息存入数据库(或者 NoSQL),以 VARBINARY 字段保存,那么序列化结果中不需要包含长度和类型,因为从字段名和字段长度中可以得知消息的类型与长度。如果把消息以 UDP 方式发生给对方,而且对方一个 UDP port 只接收一种消息类型,那么序列化结果中不需要包含长度和类型,因为从 port 和 UDP packet 长度中可以得知消息的类型与长度。如果把消息以 TCP 短连接方式发给对方,而且对方一个 TCP port 只接收一种消息类型,那么序列化结果中不需要包含长度和类型,因为从 port 和 TCP 字节流长度中可以得知消息的类型与长度。如果把消息以 TCP 长连接方式发给对方,但是对方一个 TCP port 只接收一种消息类型,那么序列化结果中不需要包含类型,因为 port 代表了消息的类型。如果采用 RPC 方式通信,那么只需要告诉对方 method name,对方自然能推断出 Request 和 Response 的消息类型,这些可以由 protoc 生成的 RPC stubs 自动搞定。对于最后一点,比方说 sudoku.proto 定义为:service SudokuService {rpc Solve (SudokuRequest) returns (SudokuResponse);}那么 RPC method Sudoku.Solve 对应的请求和响应分别是 SudokuRequest 和 SudokuResponse。在发送 RPC 请求的时候,不需要包含 SudokuRequest 的类型,只需要发送 method name Sudoku.Solve,对方自知道应该按照 SudokuRequest 来解析(parse)请求。这个例子来自我的半成品项目 evproto。对于上述这些情况,如果 protobuf 无条件地把长度和类型放到序列化的字节串中,只会浪费网络带宽和存储。可见 protobuf 默认不发送长度和类型是正确的决定。Protobuf 为消息格式的设计树立了典范,哪些该自己搞定,哪些留给外部系统去解决,这些都考虑得很清楚。只有在使用 TCP 长连接,且在一个连接上传递不止一种消息的情况下(比方同时发 Heartbeat 和 Request/Response),才需要我前文提到的那种打包方案。(为什么要在一个连接上同时发 Heartbeat 和业务消息?请见陈硕《分布式系统的工程化开发方法》 p.51 心跳协议的设计。)这时候我们需要一个分发器 dispatcher,把不同类型的消息分给各个消息处理函数,这正是本文的主题之一。

Protobuf语法介绍

我们先看看官方文档给出的定义和描述 简单来讲, ProtoBuf 是结构数据序列化方法,可简单类比于,其具有以下特点: 在protobuf中,协议是由一系列的消息组成的。因此最重要的就是定义通信时使用到的消息格式。一个Protobuf 消息(对应JAVA类),由至少一个字段(对应Java类属性)组合而成。 消息的定义很简单,就是message关键字加上消息的名字 字段定义格式: 限定修饰符 | 数据类型 | 字段名称 | = | 字段编码 required: 表示是一个必须字段,必须相对于发送方,在发送消息之前必须设置该字段的值,对于接收方,必须能够识别该字段的意思。发送之前没有设置required字段或者无法识别required字段都会引发编解码异常,导致消息被丢弃。 optional: 表示是一个可选字段,可选对于发送方,在发送消息时,可以有选择性的设置或者不设置该字段的值。对于接收方,如果能够识别可选字段就进行相应的处理,如果无法识别,则忽略该字段,消息中的其它字段正常处理。---因为optional字段的特性,很多接口在升级版本中都把后来添加的字段都统一的设置为optional字段,这样老的版本无需升级程序也可以正常的与新的软件进行通信,只不过新的字段无法识别而已,因为并不是每个节点都需要新的功能,因此可以做到按需升级和平滑过渡。 repeated: 表示该字段可以包含0~N个元素。其特性和optional一样,但是每一次可以包含多个值。可以看作是在传递一个数组的值。类比于Java这边的List protobuf定义了一套基本的数据类型,几乎都映射了Java语言的基础数据类型(主要以Java为例) 详见下面表格 字段的命名方式与Java的命名方式大致一致 字段编码是一个序列化和反序列化的标记值,有了该值,通信双方才能互相识别对方的字段。当然相同的编码值,其限定修饰符和数据类型必须相同。编码值的取值范围为 1~2^32(4294967296) 其中 1~15的编码时间和空间效率都是最高的,编码值越大,其编码的时间和空间效率就越低(相对于1-15),当然一般情况下相邻的2个值编码效率的是相同的,除非2个值恰好实在4字节,12字节,20字节等的临界区。比如15和16 1900~2000编码值为Google protobuf 系统内部保留值,建议不要在自己的项目中使用。protobuf 还建议把经常要传递的值把其字段编码设置为1-15之间的值 完整的消息定义示例 枚举的定义和Java 相同,使用 enum 关键字,但是有一些限制。 枚举值必须大于等于0的整数。 使用分号 ; 分隔枚举变量而不是Java 语言中的逗号 , 示例: 你可以将其他消息类型用作字段类型。已我们现在IM的为例,在每一个CSSendLiveRoomMsgReq消息中包含ImMsgBody消息,此时可以在相同的.proto文件中定义一个ImMsgBody消息类型,然后在CSSendLiveRoomMsgReq消息中指定一个ImMsgBody类型的字段 示例: 如果你的消息中有很多可选字段, 并且同时至多一个字段会被设置, 你可以加强这个行为,使用oneof特性节省内存,Oneof字段就像可选字段, 除了它们会共享内存, 至多一个字段会被设置。 设置其中一个字段会清除其它字段。 为了在.proto定义Oneof字段, 你需要在名字前面加上oneof关键字, 比如下面例子的ImMsgBody: oneof的特性

了解一下ProtoBuf

我们在进行网络通信调用的时候,总是需要将内存的数据块经过序列化,转换成为一种可以通过网络流进行传输的格式。而这种格式在经过了传输之后再经过序列化,能还原成我们预想中的数据结构。 那么我们对于这种用于中间网络传输的数据格式就有一定的要求。首先它可以准确地描述数据内容,在此基础上我们则希望它尽量的小。 最开始流行起来的是XML,可扩展标记语言。由于它可以用来标记数据、定义数据类型,所以用户可以自己定义数据自己的语言,从而让对不同的数据结构化成统一的格式称为了可能。 而另外一个我们熟知的则是JSON(JavaScript Object Notation, JS 对象简谱)。尽管JSON中缺少了XML中的标签属性等描述方式,但是足够简介和清晰的层次结构使得其成为了必XML更受欢迎的数据交换格式。 同一份数据显然JSON的数据量比XML所使用的空间更少。那么空间省略在哪里呢?一方面是json使用更简单的字符来定义数据间的关联关系;另一方面是JSON减少了对数据类型的描述。但是丢少的数据类型再哪里呢? 以Java中的 OpenFeign 举例,JSON中缺少的类型定义被定义道程序中的接口中了。当进行序列化与反序列化时,JSON格式并不记录数据的类型,具体的数据类型在序列化方与反序列化方通过事先约定的接口来进行定义。这样就减少了信息传输过程中的信息量,从而让数据得以压缩。 但是JSON由于没有定义数据类型,所以在传输的过程中实际上就都是文本流,那么这种方法还可以进一步压缩吗? 结合上文的讨论,我们先说结论:方法是有的,并写当前的实现方式是ProtoBuf。但在此之前我们先来了解一下ProtoBuf。 我们可以先看看官方给出的定义与描述: 同样的,ProtoBuf也是一种支持序列化反序列化的方法,并且他具有很多优点: 实际上,ProtoBuf提供了一种通用的数据描述方式,这种定义数据的方式是通用的,就如同JSON或者XML一样。 接下来我们来来回答本节一开始的问题,针对JSON来说,ProtoBuf是如何将体积变得更小的呢?答案很简单,就是为数据序列化反序列化提供更多的先验知识。 本文暂不过度深入ProtoBuf原理,但是可以通过一张图来进行简要说明(): ProtoBuf中的数据是按顺序进行排列,而整体的结构为若干个field,每一个field中由 Tag-[Length]-Value 组成。Length是可选的,而是否存在Length是通过Tag的类型来决定的。也就是说如果是指定的类型,比如int64,那我们就可以知道Value的长度,也就不用在依靠Length来对其空间进行描述(redis中的压缩列表也是这个思想)。 那么field应该对应的是什么字段呢?这个则是在序列化与反序列化时在ProtoBuf的服务端与客户端之间进行预先定义的。而因为提前定义了field的类型、排序,所以field本身可以不用对字段名、字段位置进行描述,只需要根据字段类型选用合适的二进制序列化方法,将字段本身的value值进行序列化传输即可。 稍微总结一下: ProtoBuf通过对传输字段的名称、顺序进行预定义,从而在传输结构中只需要顺序的记录每个字段的类型标签和二进制值。 尽管上文和官方中都是以XML或者JSON来对ProtoBuf进行对比。但是因为ProtoBuf本身就是二进制序列化方式,所以从压缩比上比较感觉有点欺负人。 对应的在Java中二进制常用的序列化器有Kryo和Hessian。但事实上,由于Kryo和Hessian中都需要对Java类名和字段信息进行存储。而ProtoBuf则只有Tag-Length-Value的数据对,且Value更是有针对性的特殊编码,所以空间占用小的很多。 Kryo是专门针对Java进行优化了的。所以在使用的便捷性上来说Kryo则更加方便。但ProtoBuf是跨平台的,且由于进行了字段的顺序定义,所以似的ProtoBuf定义后的接口是可以向前兼容的(只向后追加字段),而这种优势是Kryo所没有的。 ProtoBuf是跨语言的,使用ProtoBuf的第一步是先定一个 proto 文件 ,而由于ProtoBuf 2和3语言版本的不同,其定义格式会有所不同,具体的细节还是得参考官方文档:https://developers.google.cn/protocol-buffers/docs/proto3 对于ProtoBuf 3 的定义文档我们可以按如下方法定义: 其中message关键字是定义的文件名,而 string、int32则是预定的字段类型,repeated则是描述字段为可重复任意多次的字段。 ProtoBuf通过这种形式的文件定义了传输信息的文件结构。 但是之前小节中我们知道了ProtoBuf是通过 Tag-[Length]-Value 组成的数据组来进行信息传输的,那么proto文件中定义的内容如何转换为实际传输的对象呢? ProtoBuf的做法是,为每一种语言提供一个生成器protoc。通过使用protoc则可以根据.proto文件生成为一组java文件。对应的官方语法演示样例为: 官方的生成参考为:https://developers.google.com/protocol-buffers/docs/reference/java-generated 生成后的java文件将提供对应的实体以及数据的构造方法等文件,从而支持后续的使用。 需要注意的是,ProtoBuf是本质上是序列化方法,具体是通过Spring Cloud 的OpenFeign进行接口调用,还是通过grpc进行接口调用,都是可以的。 本文对ProtoBuff进行了概念的整理,并没有对每个细节都进行深入的梳理,可以当作概念科普来进行阅读。

protobuffer 怎么输出

在网上查了一下,虽然有很多文章介绍Protocol Buffer,但是实际使用起来,还是会遇到很多问题,所以我想应该有一个指南一样的东西,让新手很快就能使用它。Protocol Buffer简写为Protobuf,是Google开发的一种储存数据的方式,功能与XML一样,但更方便,数据量更小,速度更快,在序列化和反序列化的时候使用,有很大的优势。比如,网络游戏的通讯协议编写。更重要的是,它是一个开源项目。由于Protobuf不能生成C#代码,所以就要用到另外一个开源项目protobuf-net,用法是,在命令行用protoc.exe依据你自己定义的.proto文件,来生成.cpp文件用protobuf-net的protogen.exe来生成.cs文件,可以写一个批处理,如下:protoc -I=. --cpp_out=. Net.proto //在当前目录下,以cpp方式编译Net.protoprotogen -i:Net.proto -o:Net.cs //在当前目录下,用Net.proto生成Net.cs其实两句功能是一样,只是分别生成了Net.proto的cpp文件和cs文件,这样就可以在两种语言编写的应用程序间通信了。

Protobuf 数据格式

简单来说, Protocol Buffers 是一种和语言平台都没关的数据交换格式。 关于 Protobuf 在iOS下的使用请看上篇文章 iOS 的 Protocol Buffer 简单使用 Protobuf 序列化后的二进制数据消息非常的紧凑,这得益于 Protobuf 所采用的 Varint Varint 是一种紧凑的表示数字的方法,它用一个或多个字节来表示一个数字,值越小的数字使用越少的字节数。这能减少用来表示数组的字节数。 比如对于 int32 类型的数字,一般需要4个 byte 来标识。但是采用 Varint,对于很小的 int32 类型的数字,也能用1个 byte 来标识。如果数字很大,也就需要5个 byte 来表示了。但是,一般情况下很少会出现数字都是大数的情况下。 正常情况下,每个 byte 的8个 bit 位都用于存储数据用,而在 Varint 中,每个 byte 的最高位的 bit 有着特殊的含义,如果该位为1,表示后续的 byte 也是该数据的一部分;如果该位为0,则结束。其他的7个 bit 位都用来表示数据。因此小于127的 int32 数字都可以用一个 byte 表示,而大于等于 128 的数字:如128,则会用两个字节表示: 1000 0000 0000 0001 (采用的是小端模式),311则表示: 1011 0111 0000 0010 下图演示了 Protobuf 如果通过2个 byte 解析出 128。Protobuf 字节序采用的是 little-endian(小端模式) int32 数据类型能表示负数,负数的最高位为1,如果负数也使用这种方式表示会出现一个问题,int32 总是需要5个字节,int64 总是需要10个字节。所以 Protobuf 定义了另外一种类型 sint32, sint64,采用 ZigZag 编码,所有的负数都使用正数表示,计算方式为: Protobuf 消息是一系列的键值对组成。消息的二进制版本仅使用 field 数字当作 key,不同 field 的属性和类型只能通过消息类型的定义 (即 .proto 文件) 在解码端确定。如果消息中不存在该 field,那么序列化后的 Message Buffer 中也不会有该 field,这些特性都有助于节约消息本身的大小。 Key 用来标识具体的 field,在解包的时候,Protobuf 根据 key 就能知道相应的 Value 对应于消息中的哪一个field,数据类型是哪个类型。 Key 的定义如下: Key 由两部分组成:第一个部分是 field_number,比如上篇文章定义的消息 FooSimpleMessage 中的 msgId 属性的 field_number 为1;第二部分为 wire_type,表示 Value 的传输类型 表1. Wire Type 在之前的例子中,msgId 采用的数据类型为 int32,因此对应的 wire_type 为0,所以对应的 tag 为 FooSimpleMessage 的 msgContent,field_number 为2,wire_type 为2,所以对应的 tag 为 对应 Length-delimited 的 wire type,后面紧跟着的 Varint 类型表示数据的字节数。所以 msgContent 的 key 后面紧跟着的 0x1a 表示后面的数据长度为10个字节,"A protobuf message content" 的 ASCII 值即为: 0x41 0x20 0x70 0x72 0x6f 0x74 0x6f 0x62 0x75 0x66 0x20 0x6d 0x65 0x73 0x73 0x61 0x67 0x65 0x20 0x63 0x6f 0x6e 0x74 0x65 0x6e 0x74 在 Demo 里面定义的 msg 对象,其序列化后的数据的十六进制表示应该为 0801121a 41207072 6f746f62 7566206d 65737361 67652063 6f6e7465 6e74 运行demo,打印一下结果和猜想的一样: 参考地址: Protocol-buffers Encoding

Swift 安装protobuf

1、官方项目地址: https://github.com/apple/swift-protobuf 2、拉取项目到本地 3、进入项目本地路径,查看版本 4、根据项目需要,选择版本编译 如:1.5.0 5、构建项目 6、构建完成之后会生成一个 protoc-gen-swift 执行路径:swift-protobuf/.build/release/protoc-gen-swift7、把protoc-gen-swift文件直接拷贝到/usr/local/bin目录下 8、swift版本的protobuf已安装完成,现在可以来测试使用 准备一个proto文件(Book.proto) 9、生成swift文件 10、把生成的Book.swift文件拖入到项目中就可以使用了

为什么google protobuf不支持map的序列化和反序列化

现在它是支持的。proto2的文档就已经提到了Maps(Language Guide),但我用protoc2.6编译的时候,map关键字无法通过编译,protoc3.0编译正常,proto举例:message Person { required int32 id = 1; required string name = 2; optional string email = 3; map<string, string> values= 4; } 另外,官方文档(https://developers.google.com/protocol-buffers/docs/proto#Maps)说了:The map syntax is equivalent to the following on the wire, so protocol buffers implementations that do not support maps can still handle your data:message MapFieldEntry { key_type key = 1; value_type value = 2;}repeated MapFieldEntry map_field = N;

怎么将protobuf string类型

2.下载一个protobuf-java-2.4.1.jar文件(注意,要与你刚才下的proto.exe版本相同)然后就开始开发了。步骤:1.用记事本编写一个.proto文件:}如:编写的是test.proto package protobuf; option java_package = "com.sq.protobuf"; option java_outer_classname = "FirstProtobuf"; message testBuf { required int32 ID = 1; required string Url = 2; }将其放在与刚解压的protoc.exe同级目录中。2.在cmd中,到protoc-2.4.1-win32文件夹下,执行E:protoc-2.4.1-win32> protoc.exe --java_out=./ test.proto 则可以找到的一个生成的FirstProtobuf.java文件。3.在MyEclipse中新建一个java project,建立包com.sq.protobuf,然后将刚才生成的FirstProtobuf.java文件放在其下面。此时会报错,因为没有引入jar包,在package视图下,将protobuf-java-2.4.1.jar引入,即可解决问题。

protobuf repeated 怎么用的

protobuf repeated类型的使用protobuf是Google开发的一个序列化框架,类似XML,JSON,基于二进制,比传统的XML表示同样一段内容要短小得多。通过protobuf,可以很轻松的调用相关方法来完成业务数据的序列化与反序列化。protobuf repeated类型相当于std的vector,可以用来存放N个相同类型的内容,文章将简单介绍protobuf repeated的使用。首先定义一个protobuf结构,如下:message Person { required int32 age = 1; required string name = 2;}message Family { repeated Person person = 1;}下面以例子简单说明如何使用:int main(int argc, char* argv[]){ GOOGLE_PROTOBUF_VERIFY_VERSION; Family family; Person* person; // 添加一个家庭成员,John person = family.add_person(); person->set_age(25); person->set_name("John"); // 添加一个家庭成员,Lucy person = family.add_person(); person->set_age(23); person->set_name("Lucy"); // 添加一个家庭成员,Tony person = family.add_person(); person->set_age(2); person->set_name("Tony"); // 显示所有家庭成员 int size = family.person_size(); cout << "这个家庭有 " << size << " 个成员,如下:" << endl; for(int i=0; i<size; i++) { Person psn = family.person(i); cout << i+1 << ". " << psn.name() << ", 年龄 " << psn.age() << endl; } getchar(); return 0;}

protobuf 怎么查看版本

protobuf版本需要在protobuf程序中查看。在protobuf程序中查看版本步骤如下所示:1、点击打开计算机,进入分区列表。2、在计算机分区列表中选择protobuf程序所在的文件夹。3、点击打开protobuf程序。4、如图所示在protobuf程序中,即可完成protobuf版本查看。

protobuf可变长度原理

这篇文章在你已经了解protobuf使用的基础上,更进一步的学习,如果不知道protobuf是什么?请查阅这篇文章 【golang-protobuf使用】 官网说明地址: https://developers.google.com/protocol-buffers/docs/proto3 proto文件的可变长度类型有:int32、int64、uin32、uin64、sint32、sint64 Protobuf 用的是连续位标识技术,使用每个字节的第一位来标识是否需要继续向后读。每个字节低7位用于实际的编码。 举例: 十进制:300 二进制(4个字节):00000000 00000000 00000001 1000000 protobuf编码过程 所以最终编码结果为 1 0000000 0 1100000,这样将4字节存储大小转化为2字节存储大小 目标:将10^32bit的二进制进行编码 proto文件格式 测试结果: 由测试结果可得如果高位(左边)字节为0,编码结果大小相应减少

protobuf 怎么查看版本

protoc --version

vue使用protobuf+websocket

我的教程是用protobuf生成了proto.js文件 1、运行npm install protobufjs --save 安装 2、拿到后台给的proto文件,在src里创建一个proto目录,用于存放proto文件及编译后的js文件 proto 3、运行命令 生成proto.js文件,如图 4、使用 websocket返回的数据是model.data 官方git教程 https://github.com/protobufjs/protobuf.js

为什么google protobuf不支持map的序列化和反序列化

现在它是支持的。proto2的文档就已经提到了Maps(Language Guide),但我用protoc2.6编译的时候,map关键字无法通过编译,protoc3.0编译正常,proto举例:message Person {required int32 id = 1;required string name = 2;optional string email = 3;map<string, string> values= 4;} 另外,官方文档(https://developers.google.com/protocol-buffers/docs/proto#Maps)说了:The map syntax is equivalent to the following on the wire, so protocol buffers implementations that do not support maps can still handle your data:message MapFieldEntry {key_type key = 1;value_type value = 2;}repeated MapFieldEntry map_field = N;

python如何通过protobuf实现rpc

由于项目组现在用的rpc是基于google protobuf rpc协议实现的,所以花了点时间了解下protobuf rpc。rpc对于做分布式系统的人来说肯定不陌生,对于rpc不了解的童鞋可以自行google,这里只是做个简单的介绍。rpc的主要功能是让分布式系统的实现更为简单,为提供强大的远程调用而不损失本地调用语义的简洁性。为了实现这个目标,rpc框架需要提供一种透明调用机制让使用者不必显示区分本地调用还是远程调用。rpc架构涉及的组件如下:客户方像调用本地方法一样去调用远程接口方法,RPC 框架提供接口的代理实现,实际的调用将委托给代理RpcProxy 。代理封装调用信息并将调用转交给RpcInvoker 去实际执行。在客户端的RpcInvoker 通过连接器RpcConnector 去维持与服务端的通道RpcChannel,并使用RpcProtocol 执行协议编码(encode)并将编码后的请求消息通过通道发送给服务方。RPC 服务端接收器 RpcAcceptor 接收客户端的调用请求,同样使用RpcProtocol 执行协议解码(decode)。解码后的调用信息传递给RpcProcessor 去控制处理调用过程,最后再委托调用给RpcInvoker 去实际执行并返回调用结果。protobuf rpc在上面组件中主要扮演RpcProtocol的角色,使得我们省去了协议的设计,并且protobuf协议在编码和空间效率都是上非常高效的,这也是很多公司采用protobuf作为数据序列化和通信协议的原因。同时protobuf rpc定义了一个抽象的rpc框架,如下图所示:RpcServiceStub和RpcService类是protobuf编译器根据proto定义生成的类,RpcService定义了服务端暴露给客户端的函数接口,具体实现需要用户自己继承这个类来实现。RpcServiceStub定义了服务端暴露函数的描述,并将客户端对RpcServiceStub中函数的调用统一转换到调用RpcChannel中的CallMethod方法,CallMethod通过RpcServiceStub传过来的函数描述符和函数参数对该次rpc调用进行encode,最终通过RpcConnecor发送给服务方。对方以客户端相反的过程最终调用RpcSerivice中定义的函数。事实上,protobuf rpc的框架只是RpcChannel中定义了空的CallMethod,所以具体怎样进行encode和调用RpcConnector都要自己实现。RpcConnector在protobuf中没有定义,所以这个完成由用户自己实现,它的作用就是收发rpc消息包。在服务端,RpcChannel通过调用RpcService中的CallMethod来具体调用RpcService中暴露给客户端的函数。介绍了这么多,对于怎么样用protobuf rpc来实现一个rpc肯定还是一头雾水吧,下面就用protobuf rpc来实现一个简单的python版rpc demo吧。下面直接给出demo描述PRC的proto文件,至于proto文件的编写规则可以参考protobuf官网。common.proto文件:package game;message RequestMessage{ required string message = 1;}message ResponseMessage{ required string message = 1;}game_service.proto文件:package game;import "common.proto";option py_generic_services = true;service GameService{ rpc connect_server(RequestMessage) returns(RequestMessage);}common.proto文件描述了RPC中收发的消息;game_service.proto描述了服务器导出的connect_server函数,该函数接受RequestMessage对象作为参数,并返回RequestMessage对象。在使用PRC协议时,必须加上option py_generic_services = true;可选项,要不然编译器不会生成包含connect_server函数的GameService描述。使用编译器protoc编译proto文件,具体命令为:protoc.exe --python_out=. game_service.proto编译后生成的文件为game_service_pb2.py,该文件主要是实现了GameService和GameService_Stub类。GameService_Stub类用于客户端调用者来调用GameService的服务。前面已经说了,在客户端,RpcChannel只实现了一个空的CallMethod,所以需要继承RpcChannel重新这个函数来encode消息和发送消息。在服务端RpcChannel需要调用CallMethod来调用Service中的函数。具体实现如下:class MyRpcChannel(service.RpcChannel): def __init__(self, rpc_service, conn): super(MyRpcChannel, self).__init__() self.logger = LogManager.get_logger("MyRpcChannel") def CallMethod(self, method_descriptor, rpc_controller, request, response_class, done): """"protol buffer rpc 需要的函数,用来发送rpc调用""" self.logger.info("CallMethod") cmd_index = method_descriptor.index assert(cmd_index < 65535) data = request.SerializeToString() total_len = len(data) + 2 self.conn.send_data("".join([pack("最后就是继承GameService,并实现connect_server函数了。class GameService(game_service_pb2.GameService): def __init__(self): self.logger = LogManager.get_logger("GameService") def connect_server(self, rpc_controller, request, callback): self.logger.info("%s", request.message) 至于用于网络收发消息的RpcConnector,可以使用python的asyncore库实现,具体实现在这就不讨论了。从上面的实现来看,protobuf rpc的实现主要包括编写proto文件并编译生成对应的service_pb2文件,继承RpcChannel并实现CallMethod和调用Service的CallMethod,继承Service来实现暴露给客户端的函数。

为什么Protobuf的默认序列化格式没有包含消息的长度与类型

编译后protobuf形成对应的文件,加入工程,创建你的消息对象,给里面的成员赋值,然后将这个对象转化为字节流,用socket函数直接write出去即可。

怎么样编写Protobuf的.proto文件

ProtoBuf java 包编译ProtoBuf的官方下载包并不包含jar文件,需要用户自己configure/make….来自行编译。由于Windows上没有编译环境,就用了一个笨一点方法处理了。分别下载:protobuf-2.4.1.zip ProtoBuf的源文件(包含了C++/Java/Python)的源文件protoc-2.4.1-win32.zip 已经编译过的用于Windows平台的protoc命令(该命令用于将.proto文件转化为Java或C++源文件)。分别解析这两个文件,你可以在protoc-2.4.1-win32.zip解压后的文件中找到一个protoc.exe文件,将其copy到protobuf-2.4.1/src目录下,然后进入protobuf-2.4.1/java,执行:mvn install

ProtoBuf简介

ProtoBuf是一种无关语言,无关平台的序列化结构数据的方法,可用于通信协议、数据存储等 XML:数据较为冗余,需要成对的闭合标签 JSON:使用键值对方式,压缩了一定的数据空间并且具有可读性 ProtoBuf:适合高性能,对响应速度有要求的数据传输场景,ProtoBuf是二进制数据格式,需要解码和编码,数据本身不具有可读性,只能反序列化后才能读到真正的数据。序列化后的数据相比json和xml很小,适合网络传输;序列化和反序列化比json的处理速度更快。 XML、JSON 更注重数据结构化. ProtoBuf更注重数据序列化,关注效率、空间、速度 数据类型分为两大类: 复合数据类型:枚举和message类型 标准数据类型:整型,浮点,字符串 规则的修饰符: required 字段必须出现1次 optional 字段可出现0次或1次 repeated 字段可出现多次(包括0) 标准数据类型: proto与python类型对应 例如:

在项目中使用Protobuf协议实现数据传输(二)

上篇已经简单的分析了什么是ProtoBuf协议的优缺点、简单的环境配置、项目中的简单使用和一些编写.Proto文件的注意点,下面我们更加深入一下ProtoBuf的语法及高级使用(非常感谢Carson_Ho大神的博文指导) 作用 :防止不同 .proto 项目间命名 发生冲突 ProtoBuf包的解析过程如下 : 作用 :影响 特定环境下 的处理方式,但不改变整个文件声明的含义 常用Option选项 :(因为使用有限,简单列举常见的) 作用 :真正用于描述 数据结构 在.proto消息模型中主要有 消息对象&字段 组成 :字段 = 字段修饰符 + 字段类型 +字段名 +标识号(主要针对proto2以前版本) 字段 = 字段类型 +字段名 +标识号(主要针对proto3及以后版本) 一个消息对象 可以将 其他消息对象类型 用作字段类型 关于ProtoBuf在项目中的实践的高级用法请关注:下一篇博客:在项目中使用Protobuf协议实现数据传输(三)

rpc框架:thrift 和protobuf有什么区别?

fastrpc protobuf的一个全部开源的高性能rpc实现,支持客户端跨平台 中国人写的

[TDW]Protobuf在腾讯数据仓库TDW的使用

Protobuf在腾讯数据仓库TDW的使用_ IT技术精华 http://it.taocms.org/11/5991.htm 马淑婧:TDW Protobuf存储格式功能介绍-CSDN.NET http://www.csdn.net/article/a/2014-06-06/15818975 protobuf是google提供的一个开源序列化框架,类似于XML、JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多。虽然是二进制数据格式,但并没有因此变得复杂,开发人员通过按照一定的语法定义结构化的消息格式,然后送给命令行工具,工具将自动生成相关的类,可以支持java、c++、python等语言环境。通过将这些类包含在项目中,可以很轻松的调用相关方法来完成业务消息的序列化与反序列化工作。 protobuf在google中是一个比较核心的基础库,作为分布式运算涉及到大量的不同业务消息的传递,如何高效简洁的表示、操作这些业务消息在google这样的大规模应用中是至关重要的。而protobuf这样的库正好是在效率、数据大小、易用性之间取得了很好的平衡。 protobuf****格式日志在tdw的支持 1、使用protobuf文件创建表 Tdw支持使用用户定义的proto文件来创建表,使用我们开发的编译器扩展对用的proto文件预处理后,通过proto文件自动抽取出表的结构,支持proto文件引用和message嵌套定义。例如: message Person {required string name = 1;required int32 id = 2; // Unique ID number for this person.optional string email = 3;enum PhoneType {MOBILE = 0;HOME = 1;}message PhoneNumber {required string number = 1;optional PhoneType type = 2 [default = HOME];}repeated PhoneNumber phone = 4;} 创建的表结构为: table person{name stringid intemail stringphone array<struct<number:string,type:int>>} Protobuf中enum 类型转化为tdw的int类型,repeated类型转化为tdw的array,支持protobuf中message定义的嵌套,嵌套message类型转化为tdw的struct类型。 2、使用嵌套message protobuf文件的读写适配 提供HDFS与mapreduce层的适配支持protobuf record的input/output format,mapreduce层与hive层的读写适配Serde层支持嵌套类型的message读写和protobuf默认值的支持。 创建普通表(不包含分区)create table comp stored as pb 创建带分区的表,假设comp message中包含log_date的字段,以log_date字段建立分区的SQL为:create table comp partition by list(log_date) (partition default) stored as pb 注意事项 proto文件名一定要是小写,并且不能包含空格等特殊字符; proto文件中用到import其他proto文件的,不要写路径,只指明文件名即可,例如import “text.proto”; 主proto文件的message名字一定要与表名相同,根据proto文件生成jar包的时候会进行检查,不相同会报错 自定义的类型名和变量名不能相同(支持区分大小写,即message A类型的变量名可以为a),否则生成jar包会失败 不能包含空的message,否则建表的时候会出错 protobuf格式的表入库tdw,直接用hadoop命令将pb文件上传到对应表或分区的目录下即可,支持gz压缩。 使用tdw SQL对protobuf表做日志分析,简单字段可以用通用SQL语法处理,以repeated类型为例描述如何用Lateral View + explode 的SQL处理pb表中的复杂字段。

Mymumwantstobuyanewskirt的意思是什么

我妈妈想买一件新裙子希望帮助你

shewantstobuyacar的同义句

She wants to buy her mother a nice present

does she wanttobuyacard,改为陈述句

. She wants to buy a car,这就是陈述句

lwanttobuyabag什么意思?

I want to buy a bag. 意思是我想买一个包。愿可爱的你采纳!

whocomestobuyaskirt什么意思

谁来买裙子

英语作文:howtobuidebeautifulschoolyard

Our school isnu2019t too big,but it is very beautiful.In spring,itu2019s covered with green trees ,and some birds are singing in the trees.So all of the students like our school very much.Our school has 18 classes-here are 3 grades,and there 6 classes in each grade.In our school,there is a big football fields,two basketball courts,and some pingpong courts and so on.They are all our favorite places.Classrooms are our study places.We have classes here.Itu2019s our knowledge paradise.All of our teachers work very hard without any complain

如何评价tobu电板鸭

1、思想成熟、精明能干、为人诚实。2、反应快、有进取心的应聘者。3、个性稳重、具高度责任感。4、工作很有条理,办事效率高。5、积极主动、独立工作能力强,并有良好的交际技能。6、精力旺盛、思想新潮。7、举止优雅、个人性格好。

哪位大神有Tobu的电音合辑?谢谢谢~!

欢迎入tobu群 七七零三六四一五 有你想要的,入群后请自觉采纳~如果你认可我的回答,请及时点击【采纳为满意回答】按钮~~手机提问者在客户端右上角评价点【满意】即可。~你的采纳是我前进的动力~~~如还有新的问题,请不要追问的形式发送,另外发问题并向我求助或在追问处发送问题链接地址,答题不易,敬请谅解~~O(∩_∩)O,记得好评和采纳,互相帮助资源来源于网络,如有出入,还请谅解

求tobu的电音seven,这首曲子的无损版。。

复制整段信息,去酷狗搜索此码#153218#即可看到我的歌曲如未安装酷狗,点此下载http://www.kugou.com

Tobu - Hope (Original Mix)MP3格式下载的谢了!!!

Tobu-Hope(OriginalMix) 已经上传,可以直接点击下方的绿色按钮“点击下载”若符合你所求的资源,还望选为满意答案路过的同学下载后还可以点一下赞同很抱歉,回答者上传的附件已失效

求类似Tobu,Alan Walker 这种风格的电音歌手

为什么在qq音乐找不到tobu的歌?

tobu的歌曲版权被百度音乐买下了,只能去百度音乐听。

Tobu - Hope (Original Mix)MP3格式下载的谢了!!!

已上传附件资源来源于网络,如有出入,还请谅解~如果你认可我的回答,请及时点击【采纳为满意回答】按钮~~手机提问者在客户端右上角评价点【满意】即可。~你的采纳是我前进的动力~~~如还有新的问题,请不要追问的形式发送,另外发问题并向我求助或在追问处发送问题链接地址,答题不易,敬请谅解~~O(∩_∩)O,记得好评和采纳,互相帮助

hewanttobuyabook有不对的地方吗

有的,He是第三人称,如果你是用在一般现在时,want就要加上s(即变为wants)但如果他想买一本书是发生在过去时,就要在want后加ed(即变为wanted)所以你的句子有两种修正办法: 1.He wants to buy a book;(一般现在时) 2.He wanted to buy a book;(过去时)以上两个句子都可以,但要结合实际情况去选择的。(关键看时态去选择)

SeiMatobu是谁

SeiMatobuSeiMatobu,演员,主要作品《石榴坡的复仇》。外文名:SeiMatobu职业:演员代表作品:《石榴坡的复仇》合作人物:若松节朗电影作品人物关系

求徐梦圆 / Tobu《Feels》mp3下载

徐梦圆歌曲大全在线听免费,百度网盘下载资源:链接:https://pan.baidu.com/s/1te0QRFGLmwi-VzG_vmZPcg?pwd=j02r 提取码:j02r简介: 徐梦圆,1992年10月22日出生于四川省泸州市,中国内地DJ、音乐制作人,毕业于北京现代音乐研修学院录音艺术专业。

这是什么纯音乐,类似于Tobu的《Hope》?

你这哼的有点像Avicii的《Waiting For Love》,一首英文歌。好像是中间伴奏的片段。

英雄联盟视频的各种bgm不要tobu 要20个

优酷自己搜

求一些电音纯音乐要嗨到爆的那种跟tobu一差不多类型的

午夜dj

求Tobu的Floating的歌词

歌曲名:Floating歌手:Eloy专辑:Floating (Remastered Album)Floatin"Justin Timberlakefeat. Charlie Wilson & Will.IAmYeah Yeah Yeahwe floatin" we floatin" we floatin"<Will.I.Am>Charlie Wilson in the houseJ.T.Will.I.Am<Charlie>I, I"m not sure just how to say this to youThe words just don"t come out rightBut that doesn"t mean that I don"t feel somethin" for yaYou gotta understand that loveLove was something I knew nothing aboutUntil I met youBut you, girlYou"re the one that turned my heart aroundAnd for that I love you<Pre-Chorus>I"m walking on the skyGirl you"re making me highMy feet can hardly touch the groundOo damn I"m mesmerizedI"m floatin" on the skyGirl you"re making me highMy feet can hardly touch the groundOo damn I"m mesmerized<Chorus>I tried everything I knew from beforeShe broke my technique and now my heart is soreI"m on cloud nine and I want some moreShe got me floatin"I had to say do do, do do, do do do do do doSay do do do do do doIf you"re in love let me hear you say do do, do do, do do do do doSay do do do do do doIf you"re in love...<Justin>Said hey, girlI just can"t seem to take my eyes off of you(But who could blame me?)"Cause when I look into those baby bluesI can feel my heart fall to the groundAnd for that I love you<Pre-Chorus>I"m walking on the skyGirl you"re making me highMy feet can hardly touch the groundOo damn I"m mesmerizedI"m floatin" on the skyGirl you"re making me highMy feet can hardly touch the groundOo damn I"m mesmerized<Chorus>I tried everything I knew from beforeShe broke my technique and now my heart is soreI"m on cloud nine and I want some moreShe got me floatin"I had to say do do, do do, do do do do do doSay do do do do do doIf you"re in love let me hear you say do do, do do, do do do do doSay do do do do do doIf you"re in love...<Will.I.Am>Girl you got me walkin" on the skySho" nuff make a brother feel highAnd it feels like I"m floatin"But I ain"t smokin" dopeOne day I hope you could tell me whyWhy the sun don"t shine when you"re goneBaby, you"ve still got that thing to turn me onLike the first time I peeped yaI wanted to freak yaAnd getcha up outta your thongI wanna freak ya, freak ya, freak freak yaGet kinky, put your booty on a speakerAnd when my waist go boomAnd the bass go boomCan I se-quence the beat to treat ya?"Cause it"s seven in the morning and it just don"t stopAnd we"ve been at it since eleven o"clockThe chocolate rabbit with the hippity hopMakin" love letcha flow...I tried everything I knew from beforeShe broke my technique and now my heart is soreI"m on cloud nine and I want some moreShe got me floatin"I had to say do do, do do, do do do do do doSay do do do do do doI"m floatin"Do do, do do, (Floatin" on the sky, yea yea) do do do do do doSay do do do do do doIf you"re in loveDo do, do do, do do do do do ...Say do do do do do do ...If you"re in love...<Justin - spoken>Uncle Charlie, preach<Charlie - scatting>

Tobu higher 专辑封面是在哪?

为什么我感觉tobu的电音那么棒!确基本上没人爱听?

你很特别

日本的东武(Tobu)和西武(Seibu)有什么关系?

东武铁道属旧芙蓉集团,线路463km。是第二大私营铁路。也有其他行业。西武铁道属堤义明的西武集团,线路176km。在五星级酒店连锁,百货,棒球队,房地产等,西武集团曾经是世界首富,当然也是日本首富了。东,西武之间并无联系。

Tobu的经典十佳电音,听到就情不自禁抖腿,嗨翻天

我今天给大家推荐Tobu十佳电音,排名不分先后,这个是我个人觉得最好听的最好听的歌曲。如果有喜欢的小伙伴可以加个关注,点个赞,还可以在评论区小伙伴们交流讨论,还可以分享和收藏。 1、Summer Breeze Tobu于1992年9月10日出生于拉脱维亚首都里加,是一名音乐制作人,他自2010年起开始进行音乐的磨练和创作。同时也是第三人称表达的忠实爱好者。他的作品首首让人心动,风格既可清新自然也可激情澎湃。 2、Floating 开车时不要听啊,请注意行车安全:道路千万条,安全第一条,行车不规范,亲人两行泪 3、Higher 我们一定要铭记Tobu这位伟大的DJ以及国内英雄联盟精彩剪辑视频的众多UP主们,是他们对Tobu难以名述的爱与迷恋让无数的的英雄联盟爱好者早早的脱离了土嗨的深渊,展开了对电音的热情追求,提升了品味,陶冶了情操,打上了最强王者,赢取了白富美,走向了人生的巅峰! 4、Infectious tobu电音之中最吸引我的往往不是动词大次的鼓点节奏,而是弹电,这一曲的话,2分07秒和 4分07秒和最后的2声咳嗽为这首电音加入了十足的创意和DJ的个人气息。 5、Magic Tobu本来在我们国内没有什么名气,但是这位年轻的天才dj作品真的做得很好,深得我们大家的认可,就这一点,大家喜欢他的作品可以到网易云音乐搜索,还是可以找到很多他的作品! 6、Cloud 9 无与伦比的魔法。让你从轻快的音乐到期待极限的爆发,点头抖腿,无法表达内心的激扬澎湃。Tobu,只为懂内心的人而生。 7、Life cloud 9是美国气象服务中的一个术语。在气象服务中,各种不同的云系都有各自的数字代号,如,1号云系、2号云系。那么9号云系是哪种云呢?9号云系是一种叫做"积雨云"的特定代号。而"积雨云"的位置最高,因此,cloud nine就成了"处在世界顶峰"的形象代名词,用来形容一种"情绪高涨"的状态 8、Sunburst 有人说tobu的作品听起来都差不多,我想了想以下几个原因。1.风格每个DJ都应该有的,而他擅长的就是progressive house 2. progressive house风格节奏偏向轻快,明朗,也就决定了这种风格表达的是欢快的感情,抒情范围限制住了。重复章节多,旋律变化少。 9、Colors 真正喜欢电音的人都是孤独的,因为大部分人都觉得它吵,那是因为他们以为电音都是土嗨,真正喜欢电音的都是孤单的,因为他们心中都有太多像电音中爆发的渴望,因为他们有一种渴望,成为焦点的渴望! 10、Hope 二十岁的时候,千万不要花精力和时间去犹豫和纠结什么选择是最好的,因为没有人知道,有想法就大胆地去尝试,感受不同的生活,多尝试工作类型、多读书、多旅行、多谈恋爱、多结交朋友,把这些该交的学费都交了,如此一来,三十岁以后,你才有可能从容不迫地过自己想要的生活。

Tobu是什么?

留下联系方式把,国内可能没有资源,所以搜不到~如果你认可我的回答,请及时点击【采纳为满意回答】按钮~~手机提问者在客户端右上角评价点【满意】即可。~你的采纳是我前进的动力~~~如还有新的问题,请不要追问的形式发送,另外发问题并向我求助或在追问处发送问题链接地址,答题不易,敬请谅解~~O(∩_∩)O,记得好评和采纳,互相帮助

如何评价tobu作品的给我们带来的影响?

u200du200dTobu是神,所有做ProgressiveHouse的人都是跟他学的,走的他的路还有关于风格相似问题。不是很熟悉tobu,但是我在酒吧没听到。过tobu的曲子,杭州,上海的现场没听到过tobu的歌曲。不过街上卖衣服的,理发店里的音响有放过。朋友手机里有放过,视频的背景音乐有。我觉得相当刺耳,因为我喜欢DeepHouse。说影响力,还没到人人都知道的程度吧?只是听他的歌知道他的吧?还有人听歌还不记歌名和作者呢。也没有什么调查说tobu的歌影响哪里了吧?当然借着这种大多数人都在做同种风格的时候,是自己做一些比较让人耳目一新的,树立自己风格的好机会。u200du200d

tobu为什么不做电音了

tobu的本名叫做托马斯·波克维斯基斯,是一位将自己喜欢一直坚持下去的大男孩。从12年大火的《Just Another Random Title》逐渐出现在中国大众的视野里。我们在观看一些游戏视频的时候会听到一些视频背景音乐也就是bgm很大一部分都是电音。随着热度的大涨tobu并没有将其发展功利化,而是像原来的样子在家的办公室里完成自己的创作。天才也会有疲惫的时候,况且创作本身就是一件很不容易的事情,加上没有外包团队的合作所以作品也慢慢变少了。

protobuf怎么生成c#文件

网站下载protobuf-csharp-port包,我下载的版本是:protobuf-csharp-port-2.4.1.473-release-binaries。2.将上述包解压缩之后,取出其中的ProtoGen.exe.config,protoc.exe,ProtoGen.exe及Google.ProtocolBuffers.dll文件放到D:protoc文件夹里(D:protoc文件夹是我自建的)。3.打开命令提示符(我的是windows7系统),先用doc命令中的cd C:命令转到C盘,然后输入D:回车,转到D盘,然后cd protoc转到D:protoc文件夹下。(非常细致哈,甚至有点啰嗦哈,不过我每次用都得google一下的呢~)4.将需要转成c#的protobuf文件也添加到D:protoc文件夹里,比如我们要转AddressBook.proto文件。5.在命令提示符内输入:protoc --descriptor_set_out=AddressBook.protobin --include_imports AddressBook.proto(上述命令之后,你会发现D protoc文件夹内多了一个AddressBook.protobin文件)接下来:protogen AddressBook.protobin回车上述命令之后,D盘protoc文件夹里多了个AddressBook.cs文件,是的,这就是万众瞩目的终极目标文件。大功告成,呵呵,很简单的吧。6.将cs文件导入项目中就可以使用了~

电脑玩不了上古卷轴5 无法定位程序输入点-BinkCopyToBufferRect@44 鱼动态链接库 binkw32.dll

应该是有游戏文件被你的电脑的杀毒软件误杀了,你自己去软件里恢复一下。

上古卷轴5启动的时候出错怎么办 ——无法定位程序输入点BinkCopytobufferrect@44于动态链接库binkw32.dll

binkw32.dll是BINK视频解码器相关进程,用于压缩视频回放,例如游戏中的视频。 如果系统提示“没有找到binkw32.dll”或者“缺少binkw32.dll”等类似错误信息,把binkw32.dll下载到本机,拷贝该文件到系统目录里并注册运行一、如果您的系统提示“没有找到binkw32.dll”或者“缺少binkw32.dll”等类似错误信息,请把binkw32.dll下载到本机。二、直接拷贝该文件到系统目录里:复制到C:WindowsSystem32目录下。可以用腾讯电脑管家修复下。打开电脑管家——电脑诊所——软件问题——缺少dll文件。如果不行,那就只有去网上下载了,(注意安全哈,扫描下) 三、然后打开“开始-运行-输入regsvr32 binkw32.dll”,回车即可解决错误提示!程序的话,尝试使用兼容模式和管理员权限运行游戏试试,操作:程序上→属性→兼容性→勾选上 使用管理员权限运行 同时 使用xp sp3 的兼容模式

上古卷轴5 无法定位程序输入点-BinkCopyToBufferRect@44 于动态链接库 binkw32.dll

下一个dll文件应该就好了。。。

求徐梦圆 / Tobu《Feels》mp3下载

这个要首先下载一个音乐酷狗软件然后再点击安装进入搜索栏里输入徐梦圆就会弹出来所有她唱的歌曲,你可以一一试听边听边缓存的,在软件设置即可

Protobuf的proto文件解析parse用的是什么算法

看起来是典型的带lookahead的递归下降(recursive descent)。没啥特别的。proto语言的文档在:Language GuideC++版的parser在:protobuf/parser.cc at master · google/protobuf · GitHub

i wanttobuyasnowwhite是什么意思

i want to buy a snow white 我想买一个白雪公主如有帮助请采纳,如对本题有疑问可追问,Good luck!

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::map<string, 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(vector<string>& 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 ", extensiopn_couny); for (int i = 0; i < extensiopn_couny; i++) { const FieldDescriptor * msg_desc = file_desc->extension(i); printf("extension type: %s ", msg_desc->name().c_str()); printf("extension cpp type: %s ", msg_desc->cpp_type_name()); printf("extension type: %s ", 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 ", 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 ", msg_desc->options().DebugString().c_str()); /*bool m = msg_desc->options().GetExtension(gateproto::protocolid); if (m) { printf("message type: %s ", 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 ",msg->GetDescriptor()->field_count()); printf("SendGsRandomMessage extension count type: %d ",msg->GetDescriptor()->extension_count()); printf("SendGsRandomMessage one count type: %d ",msg->GetDescriptor()->oneof_decl_count()); printf("SendGsRandomMessage enum count type: %d ",msg->GetDescriptor()->enum_type_count()); const Descriptor * option_Desc = msg->GetDescriptor()->options().GetDescriptor(); for (int i=0;i<option_Desc->field_count();i++) { const FieldDescriptor * filed_des = option_Desc->field(i); printf("FieldDescriptor type: %s ", filed_des->name().c_str()); } for (int i=0;i<msg->GetDescriptor()->field_count();i++) { const FieldDescriptor * filed_des = msg->GetDescriptor()->field(i); printf("FieldDescriptor type: %s ", filed_des->name().c_str()); } MessageOptions msgop= msg->GetDescriptor()->options(); const ::google::protobuf::UnknownFieldSet& unset = msgop.unknown_fields(); for (int i=0;i<unset.field_count();i++) { UnknownField filed = unset.field(i); printf("UnknownField %d",filed.varint()); } } } int main(int argc, char *argv[]) { vector<string> 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>

She_____thetemptationtobuyacoatshecouldnotafforD.A.challengedB.obstructed

【答案】:DD本题考查动词辨析。resist“抵抗,反抗,忍得住”;challenge“挑战”;obstruct“阻隔,阻塞,遮断(道路、通道等)”;contradict“同…矛盾,同…抵触”。句意为:她抵抗住了一件她买不起的衣服的诱惑。

求解?byteArray 可以转换成一个protobuf对象么

ObjectOutputStreamoos=null;//对象输出流ByteArrayOutputStreambaos=null;//byte数组输出流ByteArrayInputStreambais=null;//对象输入流try{//序列化baos=newByteArrayOutputStream();oos=newObjectOutputStream(baos);//将数组流传入对象流oos.writeObject(newInteger(1));//用对象流读取对象。byte[]bytes=baos.toByteArray();//用数组流将传入的对象转化为byte数组//反序列化bais=newByteArrayInputStream(bytes);ObjectInputStreamois=newObjectInputStream(bais);Integeri=(Integer)ois.readObject();System.out.println(i);}catch(Exceptione){}以上是把integer类型转化成byte[]数组类型。注:基本类型要转化为byte[]数组的话,需要用该基本类型的引用类。比如int的引用类是integer,就行了所有的类型,包括class都可以用这种序列化方式来转成byte[],

Protobuf协议实现原理

protobuf 是Google开源的一款支持跨平台、语言中立的结构化数据描述和高性能序列化协议,此协议完全基于二进制,所以性能要远远高于JSON/XML。由于出色的传输性能所以常见于微服务之间的通讯,其中最为著名的是Google开源的 gRPC 框架。 那么protobuf是如何实现高性能的,又是如何实现数据的编码和解码的呢? 基于128bits的数据存储方式(Base 128 Varints) Varint 是一种紧凑的表示数字的方法。它用一个或多个字节来表示一个数字,值越小的数字使用越少的字节数。这能减少用来表示数字的字节数。 比如对于 int32 类型的数字,一般需要 4 个 byte 来表示。但是采用 Varint,对于很小的 int32 类型的数字,则可以用 1 个 byte 来表示。当然凡事都有好的也有不好的一面,采用 Varint 表示法,大的数字则需要 5 个 byte 来表示。从统计的角度来说,一般不会所有的消息中的数字都是大数,因此大多数情况下,采用 Varint 后,可以用更少的字节数来表示数字信息 Varint 中的每个 byte 的最高位 bit 有特殊的含义,如果该位为 1,表示后续的 byte 也是该数字的一部分,如果该位为 0,则结束。其他的 7 个 bit 都用来表示数字。因此小于 128 的数字都可以用一个 byte 表示。大于 128 的数字,比如 300,会用两个字节来表示:1010 1100 0000 0010。 另外如果从数据大小角度来看,这种表示方式比实现的数据多了一个bit, 所以其实际传输大小就多14%(1/7 = 0.142857143)。 数字1表示方式:0000 0001 对于小的数据比较好理解,正常情况下1的二进制是 0000 0001,使用128bits表示的话,首位结束标识位也是0,所以两者结果是一样的 0 000 0001。 数字 300 表示方式:1010 1100 0000 0010 <figcaption>300</figcaption> 这个有点不太好理解了,这是因为原本用一个字节(8bit)就可以表示,但由于使用128bits表示方法,需要对每个字节的最高位添加一个结束标识位来表示,所以一个字节已经不够用了,需要占用两个字节来表示,其中两个字节最高位都是结束标识位。 如果正向推算的话,我们知道数字300的二进制值 1 0010 1100,用两个字节表示完整值则为 0000 0001 0010 1100 # 二进制 _000 0010 _010 1100 # 二进制每个字节的最高位向左移动一个位置,放入结束标识位 0 000 0010 1 010 1100 # 转换为128bits方式,1:结束,0:未结束 1 010 1100 0 000 0010 # 转换为 小端字节序 , 低字节在前,高字节在后 注意这里是先添加结束标识符,然后再转为小端字节序。 消息经过序列化后会成为一个二进制数据流,该流中的数据为一系列的 Key-Value 对。如下图所示: 采用这种 Key-Pair 结构无需使用分隔符来分割不同的 Field。 对于可选的 Field,如果消息中不存在该 field,那么在最终的 Message Buffer 中就没有该 field ,这些特性都有助于节约消息本身的大小。 Key 用来标识具体的 field,在解包的时候,客户端创建一个结构对象,Protocol Buffer 从数据流中读取并反序列化数据,并根据 Key 就可以知道相应的 Value 应该对应于结构体中的哪一个 field。 而Key也是由以下两部分组成 Key 的定义如下: | 1 | (field_number << 3) | wire_type | 可以看到 Key 由两部分组成。第一部分是 field_number 。第二部分为 wire_type 。表示 Value 的传输类型。 一个字节的低3位表示数据类型,其它位则表示字段序号。 Wire Type 可能的类型如下表所示: 在我们的例子当中,field id 所采用的数据类型为 int32,因此对应的 wire type 为 0。细心的读者或许会看到在 Type 0 所能表示的数据类型中有 int32 和 sint32 这两个非常类似的数据类型。Google Protocol Buffer 区别它们的主要意图也是为了减少 encoding 后的字节数。 每个数据头同样采用128bits方式,一般1个字节就足够了, 本例中字段a 的 序号是1 如上创建了 Test1 的结构并且把 a 的值设为 2,序列化后的二进制数据为 0 000 1000 0 000 0010 Key 部分是 0000 1000 value 部分是 0000 0010, 其中字节最高位是结束标识位,即10进制的2,我们在转换的时候统一将符号位转为0即可。 协议规定数据头的低3位表示wire_type, 其它字段表示字段序号field_number,因此 0000 1000 _000 1000 # 去掉结束标识符位 _000 1000 # 000 表示数据类型, 这里是Varint _000 1000 # 0001 这四位表示字段序号 https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ 原文: https://blog.haohtml.com/archives/20215

tomorrowwearegoingtobuychrismasgifts是什么意思

明天我们要去买礼物

photobucket网站的外链为什么老打不开?

photobucke被屏蔽了下个小语加速器就可以了

bust tobust

你断句错啦,"identity-theft bust"是一个phrase,意思是“个人信息窃盗案的告破”;bust在这里作"告破‘解. to date是"到今天为止‘,迄今为止的意思.