You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用C语言库libbson将BSON文档复制到缓冲区或文件?

嘿,我正好对libbson这块熟得很,来帮你把关键步骤理清楚!其实把BSON文档导出到缓冲区或者写入文件的核心就是用libbson的序列化API,你之前可能没抓对重点函数,我分两种场景给你详细拆解:

一、将BSON文档复制到缓冲区

要把BSON文档复制到自定义缓冲区,核心是先拿到序列化后的文档长度,再分配足够的内存,最后完成复制:

  • 首先用bson_get_data_size()获取BSON文档序列化后的字节长度,这是你分配缓冲区的依据
  • 用malloc()分配对应大小的缓冲区(记得检查分配是否成功)
  • 调用bson_copy_to_buffer()把文档的二进制数据复制到缓冲区里
  • 用完缓冲区后一定要用free()释放,文档也要用bson_destroy()销毁,避免内存泄漏
二、将BSON文档写入文件

这里有两种常用方式,看你的需求选:

  1. 便捷方式:用libbson封装好的函数
    直接调用bson_write_to_file(),传入BSON文档指针和文件名就行,它会帮你处理文件打开、写入、关闭的全流程,返回true表示成功,false表示失败。

  2. 灵活方式:手动操作文件流
    如果需要自定义文件操作(比如写入已经打开的文件句柄),可以用bson_get_data()拿到文档内部的二进制数据指针,再配合fwrite()写入文件。注意一定要用二进制模式("wb")打开文件,不然在Windows系统下会因为换行符转换破坏BSON结构。

完整代码示例

下面是一个包含两种场景的完整可运行代码,你可以参考:

#include <bson.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    // 创建并填充BSON文档
    bson_t *doc = bson_new();
    if (!doc) {
        fprintf(stderr, "Failed to create BSON document\n");
        return 1;
    }

    // 填充示例数据
    bson_append_utf8(doc, "name", -1, "Alice", -1);
    bson_append_int32(doc, "age", -1, 30);
    bson_append_bool(doc, "is_student", -1, false);

    // 验证文档有效性(可选但推荐)
    if (!bson_validate(doc, BSON_VALIDATE_NONE, NULL)) {
        fprintf(stderr, "Invalid BSON document\n");
        bson_destroy(doc);
        return 1;
    }

    // --- 场景1:复制到缓冲区 ---
    size_t buf_len = bson_get_data_size(doc);
    uint8_t *buf = malloc(buf_len);
    if (!buf) {
        fprintf(stderr, "Failed to allocate buffer\n");
        bson_destroy(doc);
        return 1;
    }

    if (!bson_copy_to_buffer(doc, buf, buf_len)) {
        fprintf(stderr, "Failed to copy BSON to buffer\n");
        free(buf);
        bson_destroy(doc);
        return 1;
    }
    printf("Successfully copied BSON to buffer (size: %zu bytes)\n", buf_len);

    // 这里可以对buf进行后续操作(比如网络传输)
    free(buf); // 用完释放缓冲区

    // --- 场景2:写入文件 ---
    // 方法1:便捷函数
    if (!bson_write_to_file(doc, "output.bson")) {
        fprintf(stderr, "Failed to write via bson_write_to_file\n");
    } else {
        printf("Successfully wrote BSON to output.bson\n");
    }

    // 方法2:手动写入
    FILE *fp = fopen("output_manual.bson", "wb");
    if (fp) {
        size_t written = fwrite(bson_get_data(doc), 1, buf_len, fp);
        if (written != buf_len) {
            fprintf(stderr, "Failed to write all bytes\n");
        } else {
            printf("Successfully wrote BSON to output_manual.bson\n");
        }
        fclose(fp);
    } else {
        fprintf(stderr, "Failed to open file\n");
    }

    // 清理资源
    bson_destroy(doc);
    return 0;
}
关键注意点
  • 文档有效性:填充完文档后可以用bson_validate()检查,避免导出无效的BSON数据
  • 内存管理:手动分配的缓冲区一定要释放,BSON文档用完必须销毁
  • 文件模式:写入文件时务必用二进制模式("wb"),防止格式损坏

内容的提问来源于stack exchange,提问作者zille

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:11:31