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

如何在填充前计算Borsh编码所需的Buffer大小?

计算Borsh编码所需的Buffer大小

要解决硬编码Buffer大小的问题,你可以通过逐个计算每个字段的Borsh编码长度动态确定所需的Buffer容量,核心逻辑基于Borsh的编码规则:

  • 固定大小类型(如u8):编码长度固定为1字节
  • 字符串类型(str):编码由4字节的u32长度前缀 + 字符串的UTF-8字节数据组成

针对你的结构,直接计算所有字段的总编码长度,再创建刚好匹配的Buffer即可,修改后的代码如下:

import { struct, u8, str } from "@coral-xyz/borsh";
import { log } from "console";

const structure = struct([
  u8("variant"),
  str("title"),
  u8("rating"),
  str("description"),
]);

const serialize = (
  title: string,
  rating: number,
  description: string
): Buffer => {
  // 计算各字段的编码长度
  const variantLen = 1; // u8固定占1字节
  const titleLen = 4 + Buffer.from(title).length; // 4字节前缀 + 字符串UTF-8字节数
  const ratingLen = 1; // u8固定占1字节
  const descriptionLen = 4 + Buffer.from(description).length; // 4字节前缀 + 字符串UTF-8字节数

  // 求和得到总编码长度,创建刚好合适的Buffer
  const totalLen = variantLen + titleLen + ratingLen + descriptionLen;
  const buffer = Buffer.alloc(totalLen);

  structure.encode(
    {
      variant: 0,
      title,
      rating,
      description,
    },
    buffer
  );

  return buffer;
};

let title: string = "Silence of the Lambs";
let rating: number = 5;
let description: string =
  "A young FBI cadet must confide in an incarcerated and manipulative killer to receive his help on catching another serial killer who skins his victims.";

const serialized = serialize(title, rating, description);

log(serialized.toString("hex"));

扩展说明

如果你的结构包含嵌套结构体、数组等复杂类型,可以封装通用的长度计算函数,遍历结构体字段并递归计算每个字段的编码长度。但对于当前场景,直接计算的方式已经足够高效简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 17:15:12