KIT

createDecoder

Call Signature

createDecoder<TTo, TSize>(decoder): FixedSizeDecoder<TTo, TSize>

通过使用提供的 read 函数填充缺失的 decode 函数来创建一个 Decoder

此实用程序不是手动实现 decode,而是利用现有的 read 函数和大小属性来生成完整的解码器。提供的 decode 方法将从给定偏移量的 Uint8Array 中读取并返回解码后的值。

如果提供了 fixedSize 属性,则将创建一个 FixedSizeDecoder,否则将创建一个 VariableSizeDecoder

Type Parameters

Type ParameterDescription
TTo解码值的类型。
TSize extends number编码值的固定大小(以字节为单位)(对于固定大小的解码器)。

Parameters

ParameterTypeDescription
decoderOmit<FixedSizeDecoder<TTo, TSize>, "decode">一个实现了 read 但未实现 decode 的解码器对象。 - 如果解码器具有 fixedSize 属性,则将其视为 FixedSizeDecoder。 - 否则,它被视为 VariableSizeDecoder

Returns

FixedSizeDecoder<TTo, TSize>

一个功能齐全的 Decoder,同时具有 readdecode 方法。

Examples

创建自定义的固定大小解码器。

const decoder = createDecoder({
    fixedSize: 4,
    read: (bytes, offset) => {
        const value = bytes[offset];
        return [value, offset + 4];
    },
});
 
const value = decoder.decode(new Uint8Array([42, 0, 0, 0]));
// 42

创建自定义的可变大小解码器:

const decoder = createDecoder({
    read: (bytes, offset) => {
        const decodedValue = new TextDecoder().decode(bytes.subarray(offset));
        return [decodedValue, bytes.length];
    },
});
 
const value = decoder.decode(new Uint8Array([104, 101, 108, 108, 111]));
// "hello"

Remarks

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

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

// Unsigned 32 位整数的固定大小解码器。
const decoder = getU32Decoder();
const value = decoder.decode(new Uint8Array([42, 0, 0, 0]));
// 42
 
// 32 字节前缀 UTF-8 字符串的可变大小解码器。
const decoder = addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder());
const value = decoder.decode(new Uint8Array([5, 0, 0, 0, 104, 101, 108, 108, 111]));
// "hello"
 
// 用于自定义对象的可变大小解码器。
type Person = { name: string; age: number };
const decoder: Decoder<Person> = getStructDecoder([
    ['name', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],
    ['age', getU32Decoder()],
]);
const value = decoder.decode(new Uint8Array([3, 0, 0, 0, 66, 111, 98, 42, 0, 0, 0]));
// { name: "Bob", age: 42 }

See

Call Signature

createDecoder<TTo>(decoder): VariableSizeDecoder<TTo>

通过使用提供的 read 函数填充缺失的 decode 函数来创建一个 Decoder

此实用程序不是手动实现 decode,而是利用现有的 read 函数和大小属性来生成完整的解码器。提供的 decode 方法将从给定偏移量的 Uint8Array 中读取并返回解码后的值。

如果提供了 fixedSize 属性,则将创建一个 FixedSizeDecoder,否则将创建一个 VariableSizeDecoder

Type Parameters

Type ParameterDescription
TTo解码值的类型。

Parameters

ParameterTypeDescription
decoderOmit<VariableSizeDecoder<TTo>, "decode">一个实现了 read 但未实现 decode 的解码器对象。 - 如果解码器具有 fixedSize 属性,则将其视为 FixedSizeDecoder。 - 否则,它被视为 VariableSizeDecoder

Returns

VariableSizeDecoder<TTo>

一个功能齐全的 Decoder,同时具有 readdecode 方法。

Examples

创建自定义的固定大小解码器。

const decoder = createDecoder({
    fixedSize: 4,
    read: (bytes, offset) => {
        const value = bytes[offset];
        return [value, offset + 4];
    },
});
 
const value = decoder.decode(new Uint8Array([42, 0, 0, 0]));
// 42

创建自定义的可变大小解码器:

const decoder = createDecoder({
    read: (bytes, offset) => {
        const decodedValue = new TextDecoder().decode(bytes.subarray(offset));
        return [decodedValue, bytes.length];
    },
});
 
const value = decoder.decode(new Uint8Array([104, 101, 108, 108, 111]));
// "hello"

Remarks

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

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

// Unsigned 32 位整数的固定大小解码器。
const decoder = getU32Decoder();
const value = decoder.decode(new Uint8Array([42, 0, 0, 0]));
// 42
 
// 32 字节前缀 UTF-8 字符串的可变大小解码器。
const decoder = addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder());
const value = decoder.decode(new Uint8Array([5, 0, 0, 0, 104, 101, 108, 108, 111]));
// "hello"
 
// 用于自定义对象的可变大小解码器。
type Person = { name: string; age: number };
const decoder: Decoder<Person> = getStructDecoder([
    ['name', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],
    ['age', getU32Decoder()],
]);
const value = decoder.decode(new Uint8Array([3, 0, 0, 0, 66, 111, 98, 42, 0, 0, 0]));
// { name: "Bob", age: 42 }

See

Call Signature

createDecoder<TTo>(decoder): Decoder<TTo>

通过使用提供的 read 函数填充缺失的 decode 函数来创建一个 Decoder

此实用程序不是手动实现 decode,而是利用现有的 read 函数和大小属性来生成完整的解码器。提供的 decode 方法将从给定偏移量的 Uint8Array 中读取并返回解码后的值。

如果提供了 fixedSize 属性,则将创建一个 FixedSizeDecoder,否则将创建一个 VariableSizeDecoder

Type Parameters

Type ParameterDescription
TTo解码值的类型。

Parameters

ParameterTypeDescription
decoderOmit<FixedSizeDecoder<TTo, number>, "decode"> | Omit<VariableSizeDecoder<TTo>, "decode">一个实现了 read 但未实现 decode 的解码器对象。 - 如果解码器具有 fixedSize 属性,则将其视为 FixedSizeDecoder。 - 否则,它被视为 VariableSizeDecoder

Returns

Decoder<TTo>

一个功能齐全的 Decoder,同时具有 readdecode 方法。

Examples

创建自定义的固定大小解码器。

const decoder = createDecoder({
    fixedSize: 4,
    read: (bytes, offset) => {
        const value = bytes[offset];
        return [value, offset + 4];
    },
});
 
const value = decoder.decode(new Uint8Array([42, 0, 0, 0]));
// 42

创建自定义的可变大小解码器:

const decoder = createDecoder({
    read: (bytes, offset) => {
        const decodedValue = new TextDecoder().decode(bytes.subarray(offset));
        return [decodedValue, bytes.length];
    },
});
 
const value = decoder.decode(new Uint8Array([104, 101, 108, 108, 111]));
// "hello"

Remarks

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

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

// Unsigned 32 位整数的固定大小解码器。
const decoder = getU32Decoder();
const value = decoder.decode(new Uint8Array([42, 0, 0, 0]));
// 42
 
// 32 字节前缀 UTF-8 字符串的可变大小解码器。
const decoder = addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder());
const value = decoder.decode(new Uint8Array([5, 0, 0, 0, 104, 101, 108, 108, 111]));
// "hello"
 
// 用于自定义对象的可变大小解码器。
type Person = { name: string; age: number };
const decoder: Decoder<Person> = getStructDecoder([
    ['name', addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())],
    ['age', getU32Decoder()],
]);
const value = decoder.decode(new Uint8Array([3, 0, 0, 0, 66, 111, 98, 42, 0, 0, 0]));
// { name: "Bob", age: 42 }

See

On this page