cint and data, LIB-ZC

LIB-ZC 在内存传输的时候, 有一种对长度本身(int)的特殊编码, 可以节约一部分内存
所谓 cint_and_data 抄袭的 postfix 队列文件的存储方式

有一点绕, 不感兴趣的可以忽略本文

对 int 编码

原理, 可以参考源码: https://gitee.com/linuxmail/lib-zc/blob/master/src/stdlib/cint_and_data.c

下面给出一些例子, 整数和编码后的内存

整数编码后长度编码后内存
1181
9189
1271FF
129201 81
312238 82
654321371 77 A7

上述编码后的 int, 称为 cint

函数: 编码

void zcint_data_escape(zbuf_t * zb, const void *data, int len);

把 cint(len)+data, 追加到 zb, 我称这个过程为: 对长度为 len 的 data 做编码

void zcint_data_escape_int(zbuf_t * zb, int i);

已知 char buf[32]; sprintf(buf, "%d", i); 执行 zcint_data_escape(zb, buf, strlen(buf))

void zcint_data_escape_long(zbuf_t * zb, long i);

参考 zcint_data_escape_int

void zcint_data_escape_dict(zbuf_t * zb, zdict_t * zd);

遍历 zd, 把每对(键<=>值)编码并追加到 zd

void zcint_data_escape_pp(zbuf_t * zb, const char **pp, int size);

从指针开始遍历长度为 size 的 pp, 把 (*pp) 编码并追加到 zd

int zcint_put(int size, char *buf);

把 cint(size) 保存到buf, 返回编码后的长度

函数: 解码

int zcint_data_unescape(const void *src_data, int src_size, void **result_data, int *result_len);

src_data形如: cint(length(somedata))+somedata+otherdatas

解码一次; 解开后, 数据指针(somedata)存储到 *result_data, 长度(lenght(somedata))存储到 *result_len
返回偏移(otherdatas)

int zcint_data_unescape_all(const void *src_data, int src_size, zsize_data_t *vec, int vec_size);

解码最多 vec_size 组 cint+data
解开后, 数据指针/长度 存储到 vec
返回偏移

函数: zstream_t

参考: zstream_t

int zcint_data_get_from_zstream(zstream_t *fp);

从 fp 读数据, 并解开 cint

int zstream_get_cint(zstream_t *fp);

从 fp 读数据, 并解开 cint

int zstream_write_cint(zstream_t *fp, int len);

把 cint(len) 写到 fp

int zstream_write_cint_and_data(zstream_t *fp, const void *buf, int len);

意思: zstream_write_cint(fp, len); zstream_write(fp, buf, len);

int zstream_write_cint_and_int(zstream_t *fp, int i);

意思: char buf[32]; sprintf(buf, "%d", i); zstream_write_cint_and_data(fp, buf, strlen(buf));

int zstream_write_cint_and_long(zstream_t *fp, long l);

参考 zstream_write_cint

int zstream_write_cint_and_dict(zstream_t *fp, zdict_t * zd);

遍历 zd, 把每对(键<=>值)编码写到fp

int zstream_write_cint_and_pp(zstream_t *fp, const char **pp, int size);

从指针开始遍历长度为 size 的 pp, 把 (*pp) 编码并追加到 zd

函数: zaio_t

参考: zaio_t

void zaio_get_cint(zaio_t *aio, void (*callback)(zaio_t *aio));

请求读, 读取压缩的 int, 成功/失败/超时后回调执行 callback

void zaio_get_cint_and_data(zaio_t *aio, void (*callback)(zaio_t *aio));

请求读, 读取压缩的 int所指的数据, 成功/失败/超时后回调执行 callback

void zaio_cache_write_cint(zaio_t *aio, int len);

向缓存写压缩的 int

void zaio_cache_write_cint_and_data(zaio_t *aio, const void *data, int len);

向缓存写压缩的 int和数据

京ICP备18054515号-2 eli960@qq.com qq: 1537212398