Protocol Buffers for C
��һֱ��̫���� google protocol buffers ��Ĭ����ơ�Ϊÿ�� message type ����һ���� C++ �������Һ����ܡ����ҹٷ�û���ṩ C �汾���������� C �汾 Ҳ���������⡣
������ƺ�����������̬���Ե� binding �����������̬����������û��ǿ���ͼ�飬�������ɴ���ķ�ʽ��û���ر�ĺô��������кܴ��������ʧ����ͨ����һ�� bingding ��ķ�ʽ�Ƚϣ�������ٷ��� Python �⣬��ȫ����������ʱ������Э�飬����Щ�������ɳ����������������ߵĹ������ɴ��롣
ȥ���ʱ��������д��һ�� lua �汾�Ŀ� ��Ϊ�˶����ڹٷ��汾������������ lpeg д��һ�� .proto �ļ��Ľ����������˴�Լ���� 100 �� lua ����Ϳ��Խ����� .proto �ļ��ڵ�Э�����ݡ������� lua ��ֱ�Ӽ����ı���Э�������ļ��������������ΰ����Ҵ�æ��
��Σ�����������Ŀ�������� protobuf Э��������⣬���ͷ�úý��һ�¡��ϸ���һ��ʼ�������� luajit �úñ�дһ���� lua �档���룬���� luajit �� ffi ���Դﵽ���������ܡ����������Ժ��ֺ� C++ �汾��Ȼ�в�� (��Լֻ�ܴﵽ C++ �汾�� 25% ~ 33% ���ҵ��ٶ�) ������ȥ��д�� C + Lua binding �ķ�ʽҪ����ǣ�ȥ��д����һ�� C ����� Lua ������̫�ࡣ����������������дһ�� C ʵ�ֵ��뷨��
����һ���ʱ��������ָ�����и� googler ���Ҳ�������ƵĹ�������pb �����Ŀ������ ��������д��һ��ƪ��������Ϊʲô������һ�ݶ����������Ϻ��ҵij���һ�¡��������� api ��ƵIJ�̫�ã��Ҿ���̫���á����������Ŀ����������������Լ�����һ�ݡ�
C �汾֮���Ժ��Ѱ� api ��ƺã�����Ϊ C ȱ����Ҫ�����ݽṹ������û���������գ�ȱ���������͵�Ԫ��Ϣ��
�����������Ҿ����ṩ���� api �����㲻ͬ������
������Ҫ��̫�ߵ�ʱ�������� C ���Կ����ı����Ҫ���ṩһ�����õ� api ���� protobuf ��ʽ�� message ���ҳ�֮Ϊ message api ��
������������ api :
���ڱ��� protobuf ����Ϣ��ʹ�� rmessage ��� api
struct pbc_rmessage * pbc_rmessage_new(struct pbc_env * env, const char * typename , struct pbc_slice * slice); void pbc_rmessage_delete(struct pbc_rmessage *); uint32_t pbc_rmessage_integer(struct pbc_rmessage * , const char *key , int index, uint32_t *hi); double pbc_rmessage_real(struct pbc_rmessage * , const char *key , int index); const char * pbc_rmessage_string(struct pbc_rmessage * , const char *key , int index, int *sz); struct pbc_rmessage * pbc_rmessage_message(struct pbc_rmessage *, const char *key, int index); int pbc_rmessage_size(struct pbc_rmessage *, const char *key);
���ڽ�����Ϣ��ʹ�� wmessage ��� api
struct pbc_wmessage * pbc_wmessage_new(struct pbc_env * env, const char *typename); void pbc_wmessage_delete(struct pbc_wmessage *); void pbc_wmessage_integer(struct pbc_wmessage *, const char *key, uint32_t low, uint32_t hi); void pbc_wmessage_real(struct pbc_wmessage *, const char *key, double v); void pbc_wmessage_string(struct pbc_wmessage *, const char *key, const char * v, int len); struct pbc_wmessage * pbc_wmessage_message(struct pbc_wmessage *, const char *key); void * pbc_wmessage_buffer(struct pbc_wmessage *, struct pbc_slice * slice);
pbc_rmessage_new
�� pbc_rmessage_delete
����������ͷ� pbc_rmessage
�ṹ���ӽṹ��ȡ��������Ϣ���ַ�����������������֤�����ڵġ���������Ҫ�û������ڷ��ӵĶ��������ٹ�����
���� repeated �����ݣ�û�ж����������µ��������͡����ǰ� message �ڲ�����������Ϊ repeated ��������ƣ����Լ���ľ�����Ҫ�� api ��
������ pbc_rmessage_size
���Բ�ѯ message ��ij�� field ���ظ��˶��ٴΡ������Ϣ�в�û�б�������� field �����ܷ��� 0 ��֪����
�Ұ����еĻ�����������ȫ��ͳһ�������֣�integer , string , real ��bool ���ͱ����� integer ������enum ���ͼ������� string ��Ҳ������ integer ���� pbc_rmessage_string
ʱ������ȡ�� enum �����֣��� pbc_rmessage_integer
��ȡ�� id ��
pbc_rmessage_message
���Ի��һ������Ϣ��������صĶ�����ʽ�����٣����������ڹҽ��ڸ��ڵ��ϡ���ʹ��Ϣ��û�б�����ij������Ϣ����� api ��Ȼ������ȷ�ķ��ء�����ȡ����������Ĭ��ֵ��
integer ������ 32bit ���� 64bit ���������ܿ϶�����Ҫ������������ 32bit ����ʱ��pbc_rmessage_integer
�����һ���������Դ� NULL �����Ը� 32bit �����ݡ�
wmessage ���÷������Dz��ϵ���һ��δ�رյ���Ϣ����ѹ���ݡ������������Ϣ�����ݶ���������� pbc_wmessage_buffer
����һ�� slice ����� slice ������� buffer ��ָ��ͳ��ȡ�
��Ҫע����ǣ����ʹ�� pbc_wmessage_integer
ѹ��һ��������һ��Ҫ����λ�� -1 ����Ϊ�ӿ�һ�ɰѴ���������������ŵ�������
���ǵ�ijЩ�ڲ�ʵ�ֵ����ܣ��Լ����潲�ᵽ�� pattern api �ķ����ԣ��������ȫ��������� C/S ͨѶ�����������е� string ����ĩβ���� \0 ����Ϊ�������ڽ����ʱ���Խ��ַ���ָ��ֱ��ָ�����ݰ��ڣ�������Ҫ���⸴��һ�ݳ�����
pbc_wmessage_string
����ѹ��� \0 ��β���ַ�������Ϊѹ������ݳ������ɲ����ƶ��ġ���Ȼ��Ҳ���Բ��Լ����㳤�ȡ�������Ȳ����� <=0 �Ļ������������ strlen ��⡣���ҽ����յij��ȼ�ȥ�����������������㴫 -1 ���ͻ�����ѹ������һ�� \0 �ֽڡ�
Pattern API ���Եõ����ߵ����ܡ�������ٶȺ��ٵ��ڴ�ռ����������Ҫ���ǣ����ڱȽ�С����Ϣ���������ʹ�õõ���ʹ�� pattern api �������ᴥ������һ�ζ��ϵ��ڴ���������api ����ʱ�����е���ʱ�ڴ涼��ջ�ϡ�
��� api ���£�
struct pbc_pattern * pbc_pattern_new(struct pbc_env * , const char * message, const char *format, ...); void pbc_pattern_delete(struct pbc_pattern *); int pbc_pattern_pack(struct pbc_pattern *, void *input, struct pbc_slice * s); int pbc_pattern_unpack(struct pbc_pattern *, struct pbc_slice * s , void * output);
����������Ҫ����һ�� pattern ������ͽ����á�һ���������������ģ�
message Person { required string name = 1; required int32 id = 2; optional string email = 3; }
����һ����Ϣ�������� C �Ľṹ���У������ϣ����������
struct Person {
pbcslice name;
int32t id;
pbc_slice email;
}
����ʹ�� pbc_slice
����ʾһ�� string ����Ϊ���� message ��˵��������ַ������г��ȵġ����Ҳ�һ���� \0 ��β��slice ͬ�����Ա�ʾһ����δ�������Ϣ��
����ʹ�� pbc_pattern_new
������ pbc ��ʶ����ṹ���ڴ沼�֡�
struct pbc_pattern * Person_p = pbc_pattern_new(env , "Person" , "name %s id %d email %s", offsetof(struct Person , name), offsetof(struct Person , id), offsetof(struct Person , email));
Ȼ��Ϳ����� pbc_pattern_pack
�� pbc_pattern_unpack
����ͽ����ˡ�pattern �Ķ�������߳��������׳�������Ҳ���Կ����û����������ǣ����������������ܼ������еij��ϣ���Щ��ֵ�õģ���������д��Щ��ֵ�ã����Կ����û������ message api ��
���� repeated �����ݣ�pattern api �����ǿ���һ������ pbc_array
��
������һ�� api ����������������
int pbc_array_size(pbc_array); uint32_t pbc_array_integer(pbc_array array, int index, uint32_t *hi); double pbc_array_real(pbc_array array, int index); struct pbc_slice * pbc_array_slice(pbc_array array, int index); void pbc_array_push_integer(pbc_array array, uint32_t low, uint32_t hi); void pbc_array_push_slice(pbc_array array, struct pbc_slice *); void pbc_array_push_real(pbc_array array, double v);
�����Ǹ�������һЩ�����ݽṹ�������������ݲ���Ļ�����Ҳ����ǣ�������ϵĶ����ڴ���䡣������Ȼ�п��ܵ�����Щ api ���ܶ�������ڴ棬��ô������ֹ������Щ�ڴ档�����ڵ�һ��ʹ��ǰ�������ʼ��������ݽṹ (memset Ϊ 0 �ǿ��Ե�)��
void pbc_pattern_set_default(struct pbc_pattern * , void *data); void pbc_pattern_close_arrays(struct pbc_pattern *, void *data);
pbc_pattern_set_default
����һ���ڴ棬��һ�� pattern ����ʽ����ʼ�����е��������е�����ij�ʼ����
pbc_pattern_close_arrays
ʹ����һ�����ݣ���Ҫ�ֹ�������� api ���ر�������ݿ��е����顣
���� Extension ������������ֱ��֧�֡�û���ṩ���� get extension �� api ��������Ϊ�����ǿ��Ը���ȥ���� extension ���Ұ����е� extension field ������ǰ�������Ҫ��������ƴ���ַ����ķ�ʽ�����Ϣ���ڵ���չ��
�����ܵ��� pbc �Ļ�����
struct pbc_env * pbc_new(void); void pbc_delete(struct pbc_env *); int pbc_register(struct pbc_env *, struct pbc_slice * slice);
pbc �ⱻ��Ƴ�û���κ�ȫ�ֱ��������������ڶ��̻߳����û�Ƚϰ�ȫ����Ȼ�Ⲣû�п����̰߳�ȫ���⣬���ڲ�ͬ���߳���ʹ�ò�ͬ�Ļ�������ȫû������ġ�
ÿ��������Ҫ����ע����Ҫ����Ϣ���ͣ�����һ�� protobuf ��ٷ��������ɵ� .pb ���ݿ鼴�ɡ��� slice ����ʽ���룬register �����������ڴ�����ͷš�
������ݿ���ʵ���� google.protobuf.FileDescriptorSet ����������ġ�����������ͷdz����ӣ�ʹ�� bootstrap ���̼�����д������ں����̸����
ȫ���������Ѿ���Դ���� github ���ˣ������� https://github.com/cloudwu/pbc ȡ�����롣��ϸ���÷�Ҳ���Դ���Щ test �ļ����ҵ����ӡ�
�����������д�����Դ�����ң���д��ƪ blog ��ʱ���һ�û�п�ʼ��������Ľṹ��������õĽ����ã����ƴ� bug �����������ǡ�
��һ�����ӵ� protobuf Э��������Э�鱾������ĺܵ��ۡ�������û���κ�һ�����õ�Э�������ǰ�������������κ� protobuf Э�顣����һ�����м��������е������⡣����˵���Һ���ƾ��д��һ�� pbc_register
�� api ����Ϊ����Ҫ�� register һ�� google.protobuf.FileDescriptorSet ���Ͳ��ܿ�ʼ��������İ���
�������Ȿ��ȥ���� google.protobuf.FileDescriptorSet �����Ķ����Ƿdz��鷳�ġ���Ȼ�ҿ������� google �ٷ��Ĺ������� google.protobuf.FileDescriptorSet �� C++ �����ʼ����������ƫƫ�ֲ�ϣ��������������������������
һ��ʼ��ϣ���Զ���һ�ָ��ĸ�ʽ������Э�鱾����û�й���IJ�νṹ��ֻ��һ��ƽ̹�����顣�����ֹ��������п��ܡ���������� protoc дһ�� plugin �������Զ����Э���ʽ�����������������������Ϊϣ��������������һЩ��
��������������Dz���ʹ���ˡ������Դ������ bootstrap.c ���ֵ�Ե�ɡ�������һ�����汾�� google.protobuf.FileDescriptorSet ������������������������ɺõģ����� descriptor.pbc.h ������������ʹ������ȥ����ɵ� lua �⡣��ص� lua �����û�зų����ˡ���Ȼ���˽��죬pbc �����㹻���ƣ����ǿ����� pbc дһ�� C �汾������Ȥ��ͬѧ�������� test_pbc.c
�Ļ������ġ�
����������д, ��Ҫ���Ǹ�������,������������,��������ʵ�ֹ��̵ĺܳ�ʱ����,�����ﶼ�ݺ�һ��. ���Ժܶ����ʵ�ֵĺ����, ���ֲ����ɾ(��Ϊ��Ϊ�Ұ�����д������, ��д���ѵ���). ϣ��һ��дһ���Ż��Ļ�ϰ��, �ڶ������ֱȽ���ʵ�ֵĶ�����, ���ұ�д�ĺ���ʹ��. Ϊ��Ч��, ������д��������Բ�ͬ��������� map .
�м���Ϊ�뷨�ı�, api ��Ƹı�,�����˺ü�ǧ�д���. ����Ҳ�������������. �п���������һ��.
����, ��������ϸ�ڿ��Խ�һ���Ż�, �������ֻ���Сͷ�Ļ�����, �����Ҫ�Ĵ��붼����ʡ�Ե�. ���� packed ����Ҳֵ�ý�һ���Ż�. �������Կ��Ǽ�һ�� JIT .
���������һ�����ˡ�����д�� 5000 �д��룬����Ҫ��Ϣһ�¡�
Comments
Posted by: Anonymous | (56) October 31, 2015 07:46 PM
Posted by: jack | (55) April 14, 2015 11:55 AM
Posted by: �� | (54) March 24, 2015 10:40 PM
Posted by: Anonymous | (53) February 28, 2015 11:53 AM
Posted by: enum | (52) June 11, 2014 07:18 PM
Posted by: enum | (51) June 11, 2014 07:16 PM
Posted by: ������ | (50) March 21, 2014 02:47 AM
Posted by: joey | (49) March 7, 2014 08:58 PM
Posted by: ������rss | (48) December 7, 2013 03:28 PM
Posted by: ade | (47) August 19, 2013 04:08 PM
Posted by: ade | (46) August 19, 2013 03:55 PM
Posted by: Cloud | (45) July 22, 2013 11:03 AM
Posted by: Cloud | (44) July 22, 2013 11:00 AM
Posted by: ��� | (43) July 19, 2013 04:16 PM
Posted by: mos | (42) July 3, 2013 11:13 PM
Posted by: Cloud | (41) July 3, 2013 11:49 AM
Posted by: lpk | (40) July 3, 2013 12:03 AM
Posted by: afouri | (39) June 7, 2013 08:02 PM
Posted by: leftnoteasy | (38) March 26, 2013 03:01 PM
Posted by: 3lxl3 | (37) October 9, 2012 08:11 PM
Posted by: w01fer | (36) August 31, 2012 12:12 PM
Posted by: �۲��� | (35) May 23, 2012 02:25 PM
Posted by: ����� | (34) May 18, 2012 03:48 PM
Posted by: ������վ��� | (33) April 26, 2012 04:16 PM
Posted by: ���������� | (32) March 20, 2012 03:40 PM
Posted by: Cloud | (31) March 2, 2012 11:58 AM
Posted by: ���� | (30) March 2, 2012 11:31 AM
Posted by: ��ԭ��վ��� | (29) February 11, 2012 09:43 AM
Posted by: test | (28) December 30, 2011 11:16 AM
Posted by: �������ռҾ� | (27) December 21, 2011 07:52 PM
Posted by: Cloud | (26) December 18, 2011 02:00 AM
Posted by: tearshark | (25) December 17, 2011 05:48 PM
Posted by: tearshark | (24) December 17, 2011 05:43 PM
Posted by: tearshark | (23) December 17, 2011 05:33 PM
Posted by: zhanxw | (22) December 13, 2011 01:36 AM
Posted by: ����Ӣ�︨�� | (21) December 9, 2011 07:16 PM
Posted by: chaoslawful | (20) December 6, 2011 10:56 PM
Posted by: ����Ѭ | (19) December 5, 2011 04:38 PM
Posted by: ������乫˾ | (18) December 3, 2011 04:11 PM
Posted by: stephen | (17) December 2, 2011 10:47 PM
Posted by: �Ҳ��� vv c | (16) December 2, 2011 02:27 PM
Posted by: ���� | (15) December 1, 2011 11:03 PM
Posted by: bg5sbk | (14) December 1, 2011 05:13 PM
Posted by: �Ӽ�����վ��˾ | (13) December 1, 2011 04:24 PM
Posted by: Eguo Wang | (12) December 1, 2011 02:05 PM
Posted by: �人SEO | (11) December 1, 2011 01:38 PM
Posted by: blue | (10) December 1, 2011 01:27 PM
Posted by: dwing | (9) December 1, 2011 12:35 PM
Posted by: helloworld | (8) December 1, 2011 12:29 PM
Posted by: iloveprogramme | (7) December 1, 2011 11:21 AM
Posted by: �� | (6) December 1, 2011 11:16 AM
Posted by: [email protected] | (5) December 1, 2011 10:56 AM
Posted by: ���Ƹ� | (4) December 1, 2011 10:31 AM
Posted by: Cloud | (3) December 1, 2011 01:03 AM
Posted by: bupt | (2) December 1, 2011 12:51 AM
Posted by: mos | (1) December 1, 2011 12:51 AM