如何解压缩msgpack文件?

时间:2015-08-12 15:27:07

标签: c file disk msgpack

我正在将msgpack编码的数据写入文件。在写作时,我只是使用C API的fbuffer。如(我为该示例划分了所有错误处理):

FILE *fp = fopen(filename, "ab");
msgpack_packer pk;
msgpack_packer_init(pk, fp, msgpack_fbuffer_write);
msgpack_pack_int(pk, 42);
// more data ...

如何重新阅读此文件?我发现的所有例子都假设数据在内存中,但是,我的文件高达5GB,将它完全保存在内存中并不是一个好主意。我也不想自己阅读。毕竟,我不知道msgpack对象有多长,所以我最终可能会在缓冲区中找到半个整数。

msgpack可以直接从磁盘读取解压缩吗?或者是否有一些标准模式可以做到这一点?

2 个答案:

答案 0 :(得分:1)

好的,我设法做到了。

以下是如何写:

#include <stdlib.h>
#include <msgpack.h>
#include <msgpack/fbuffer.h>

int main(int argc, char **argv) {
    if(2 != argc) {
            fprintf(stderr, "Call all writeFile <file>");
            return;
    }

    FILE *fp = fopen(argv[1], "ab");
    msgpack_packer pk;
    msgpack_packer_init(&pk, fp, msgpack_fbuffer_write);

    for(int i=0;i<2048;i++) {
            msgpack_pack_int(&pk, i);
    }
    fclose(fp);
}

这就是读取的内容:

#include <stdlib.h>
#include <msgpack.h>

static const int BUFFERSIZE = 2048;

int main(int argc, char **argv) {
    if(2 != argc) {
            fprintf(stderr, "Call with readFile <file>");
            return 1;
    }

    char *inbuffer = (char *) malloc(BUFFERSIZE);
    if(NULL == inbuffer) {
            fprintf(stderr, "Out of memory!");
            return 1;
    }

    FILE *fp = fopen(argv[1], "rb");
    size_t off = 0;
    size_t read = 0;
    msgpack_unpacked unpacked;
    msgpack_unpacked_init(&unpacked);
    do {
            read = fread(inbuffer, sizeof(char), BUFFERSIZE - off, fp);
            off = 0;
            while(msgpack_unpack_next(&unpacked, inbuffer, read, &off)) {
                    msgpack_object_print(stdout, unpacked.data);
                    puts("");
            }
            memcpy(inbuffer, &(inbuffer[off]), read-off);
            off = read - off;
    } while(read != 0);
    free(inbuffer);
    fclose(fp);
    msgpack_unpacked_destroy(&unpacked);
    return 0;
}

我没试过,但我认为它也可以用于更大的对象(数组,地图等)。

答案 1 :(得分:1)

您可以考虑使用&#34; msgpack_unpacker&#34;相反,这似乎是MessagePack实现“流媒体”的官方方式。解串器。看一下msgpack -c / example / c / lib_buffer_unpack.c

此致,NiteHawk