KIT

createEncoder

调用签名

createEncoder<TFrom, TSize>(encoder): FixedSizeEncoder<TFrom, TSize>

通过使用提供的 write 函数和 fixedSize 属性(/api/functions/for FixedSizeEncoders)或 getSizeFromValue 函数(/api/functions/for VariableSizeEncoders)来填充缺失的 encode 函数,从而创建一个 Encoder

此实用程序不是手动实现 encode,而是利用现有的 write 函数和大小辅助函数来生成完整的 encoder。提供的 encode 方法将分配 一个正确大小的新的 Uint8Array,并使用 write 填充它。

类型参数

Type ParameterDescription
TFrom要编码的值的类型。
TSize extends number编码后的值(对于固定大小的 encoder)的固定大小(以字节为单位)。

参数

ParameterTypeDescription
encoderOmit<FixedSizeEncoder<TFrom, TSize>, "encode">一个实现了 write,但未实现 encode 的 encoder 对象。 - 如果 encoder 具有 fixedSize 属性,则将其视为 FixedSizeEncoder。 - 否则,它将被视为 VariableSizeEncoder

返回

FixedSizeEncoder<TFrom, TSize>

一个具有完整功能的 Encoder,同时具有 writeencode 方法。

示例

创建一个自定义的固定大小 encoder。

const encoder = createEncoder({
    fixedSize: 4,
    write: (value: number, bytes, offset) => {
        bytes.set(new Uint8Array([value]), offset);
        return offset + 4;
    },
});
 
const bytes = encoder.encode(42);
// 0x2a000000

创建一个自定义的可变大小 encoder:

const encoder = createEncoder({
    getSizeFromValue: (value: string) => value.length,
    write: (value: string, bytes, offset) => {
        const encodedValue = new TextEncoder().encode(value);
        bytes.set(encodedValue, offset);
        return offset + encodedValue.length;
    },
});
 
const bytes = encoder.encode("hello");
// 0x68656c6c6f

备注

请注意,虽然 createEncoder 对于定义更复杂的 encoder 很有用,但更常见的是使用 @solana/codecs 包的各种辅助函数和原语将 encoder 组合在一起。

以下是一些使用 codec 原语而不是 createEncoder 的替代示例。

// Fixed-size encoder for unsigned 32-bit integers.
// 无符号 32 位整数的固定大小 encoder。
const encoder = getU32Encoder();
const bytes = encoder.encode(42);
// 0x2a000000
 
// Variable-size encoder for 32-bytes prefixed UTF-8 strings.
// 32 字节前缀 UTF-8 字符串的可变大小 encoder。
const encoder = addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder());
const bytes = encoder.encode("hello");
// 0x0500000068656c6c6f
 
// Variable-size encoder for custom objects.
// 自定义对象的可变大小 encoder。
type Person = { name: string; age: number };
const encoder: Encoder<Person> = getStructEncoder([
    ['name', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],
    ['age', getU32Encoder()],
]);
const bytes = encoder.encode({ name: "Bob", age: 42 });
// 0x03000000426f622a000000

参见

调用签名

createEncoder<TFrom>(encoder): VariableSizeEncoder<TFrom>

通过使用提供的 write 函数和 fixedSize 属性(/api/functions/for FixedSizeEncoders)或 getSizeFromValue 函数(/api/functions/for VariableSizeEncoders)来填充缺失的 encode 函数,从而创建一个 Encoder

此实用程序不是手动实现 encode,而是利用现有的 write 函数和大小辅助函数来生成完整的 encoder。提供的 encode 方法将分配 一个正确大小的新的 Uint8Array,并使用 write 填充它。

类型参数

Type ParameterDescription
TFrom要编码的值的类型。

参数

ParameterTypeDescription
encoderOmit<VariableSizeEncoder<TFrom>, "encode">一个实现了 write,但未实现 encode 的 encoder 对象。 - 如果 encoder 具有 fixedSize 属性,则将其视为 FixedSizeEncoder。 - 否则,它将被视为 VariableSizeEncoder

返回

VariableSizeEncoder<TFrom>

一个具有完整功能的 Encoder,同时具有 writeencode 方法。

示例

创建一个自定义的固定大小 encoder。

const encoder = createEncoder({
    fixedSize: 4,
    write: (value: number, bytes, offset) => {
        bytes.set(new Uint8Array([value]), offset);
        return offset + 4;
    },
});
 
const bytes = encoder.encode(42);
// 0x2a000000

创建一个自定义的可变大小 encoder:

const encoder = createEncoder({
    getSizeFromValue: (value: string) => value.length,
    write: (value: string, bytes, offset) => {
        const encodedValue = new TextEncoder().encode(value);
        bytes.set(encodedValue, offset);
        return offset + encodedValue.length;
    },
});
 
const bytes = encoder.encode("hello");
// 0x68656c6c6f

备注

请注意,虽然 createEncoder 对于定义更复杂的 encoder 很有用,但更常见的是使用 @solana/codecs 包的各种辅助函数和原语将 encoder 组合在一起。

以下是一些使用 codec 原语而不是 createEncoder 的替代示例。

// Fixed-size encoder for unsigned 32-bit integers.
// 无符号 32 位整数的固定大小 encoder。
const encoder = getU32Encoder();
const bytes = encoder.encode(42);
// 0x2a000000
 
// Variable-size encoder for 32-bytes prefixed UTF-8 strings.
// 32 字节前缀 UTF-8 字符串的可变大小 encoder。
const encoder = addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder());
const bytes = encoder.encode("hello");
// 0x0500000068656c6c6f
 
// Variable-size encoder for custom objects.
// 自定义对象的可变大小 encoder。
type Person = { name: string; age: number };
const encoder: Encoder<Person> = getStructEncoder([
    ['name', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],
    ['age', getU32Encoder()],
]);
const bytes = encoder.encode({ name: "Bob", age: 42 });
// 0x03000000426f622a000000

参见

调用签名

createEncoder<TFrom>(encoder): Encoder<TFrom>

通过使用提供的 write 函数和 fixedSize 属性(/api/functions/for FixedSizeEncoders)或 getSizeFromValue 函数(/api/functions/for VariableSizeEncoders)来填充缺失的 encode 函数,从而创建一个 Encoder

此实用程序不是手动实现 encode,而是利用现有的 write 函数和大小辅助函数来生成完整的 encoder。提供的 encode 方法将分配 一个正确大小的新的 Uint8Array,并使用 write 填充它。

类型参数

Type ParameterDescription
TFrom要编码的值的类型。

参数

ParameterTypeDescription
encoderOmit<FixedSizeEncoder<TFrom, number>, "encode"> | Omit<VariableSizeEncoder<TFrom>, "encode">一个实现了 write,但未实现 encode 的 encoder 对象。 - 如果 encoder 具有 fixedSize 属性,则将其视为 FixedSizeEncoder。 - 否则,它将被视为 VariableSizeEncoder

返回

Encoder<TFrom>

一个具有完整功能的 Encoder,同时具有 writeencode 方法。

示例

创建一个自定义的固定大小 encoder。

const encoder = createEncoder({
    fixedSize: 4,
    write: (value: number, bytes, offset) => {
        bytes.set(new Uint8Array([value]), offset);
        return offset + 4;
    },
});
 
const bytes = encoder.encode(42);
// 0x2a000000

创建一个自定义的可变大小 encoder:

const encoder = createEncoder({
    getSizeFromValue: (value: string) => value.length,
    write: (value: string, bytes, offset) => {
        const encodedValue = new TextEncoder().encode(value);
        bytes.set(encodedValue, offset);
        return offset + encodedValue.length;
    },
});
 
const bytes = encoder.encode("hello");
// 0x68656c6c6f

备注

请注意,虽然 createEncoder 对于定义更复杂的 encoder 很有用,但更常见的是使用 @solana/codecs 包的各种辅助函数和原语将 encoder 组合在一起。

以下是一些使用 codec 原语而不是 createEncoder 的替代示例。

// Fixed-size encoder for unsigned 32-bit integers.
// 无符号 32 位整数的固定大小 encoder。
const encoder = getU32Encoder();
const bytes = encoder.encode(42);
// 0x2a000000
 
// Variable-size encoder for 32-bytes prefixed UTF-8 strings.
// 32 字节前缀 UTF-8 字符串的可变大小 encoder。
const encoder = addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder());
const bytes = encoder.encode("hello");
// 0x0500000068656c6c6f
 
// Variable-size encoder for custom objects.
// 自定义对象的可变大小 encoder。
type Person = { name: string; age: number };
const encoder: Encoder<Person> = getStructEncoder([
    ['name', addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())],
    ['age', getU32Encoder()],
]);
const bytes = encoder.encode({ name: "Bob", age: 42 });
// 0x03000000426f622a000000

参见

On this page