如何在填充前计算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
相关产品推荐
相关产品推荐

