KIT

createCodec

调用签名

createCodec<TFrom, TTo, TSize>(codec): FixedSizeCodec<TFrom, TTo, TSize>

通过使用提供的 writeread 函数填充缺失的 encodedecode 函数来创建一个 Codec

此实用程序结合了 createEncodercreateDecoder 的行为,以生成一个功能齐全的 Codecencode 方法派生自 write 函数,而 decode 方法派生自 read 函数。

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

类型参数

类型参数默认类型描述
TFrom-要编码的值的类型。
TToTFrom解码后的值的类型。
TSize extends numbernumber编码后的值以字节为单位的固定大小(对于固定大小的编解码器)。

参数

参数类型描述
codecOmit<FixedSizeCodec<TFrom, TTo, TSize>, "decode" | "encode">一个实现了 writeread,但没有实现 encodedecode 的编解码器对象。 - 如果编解码器具有 fixedSize 属性,则将其视为 FixedSizeCodec。 - 否则,将其视为 VariableSizeCodec

返回值

FixedSizeCodec<TFrom, TTo, TSize>

一个功能齐全的 Codec,具有 writereadencodedecode 方法。

示例

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

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

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

const codec = createCodec({
    getSizeFromValue: (value: string) => value.length,
    read: (bytes, offset) => {
        const decodedValue = new TextDecoder().decode(bytes.subarray(offset));
        return [decodedValue, bytes.length];
    },
    write: (value: string, bytes, offset) => {
        const encodedValue = new TextEncoder().encode(value);
        bytes.set(encodedValue, offset);
        return offset + encodedValue.length;
    },
});
 
const bytes = codec.encode("hello");
// 0x68656c6c6f
const value = codec.decode(bytes);
// "hello"

备注

此函数有效地结合了 createEncodercreateDecoder 的行为。 如果您只需要编码或解码(但不同时需要),请考虑改用这些函数。

以下是一些使用编解码器原语而不是 createCodec 的替代示例。

// 用于无符号 32 位整数的固定大小编解码器。
const codec = getU32Codec();
const bytes = codec.encode(42);
// 0x2a000000
const value = codec.decode(bytes);
// 42
 
// 用于 32 字节前缀的 UTF-8 字符串的可变大小编解码器。
const codec = addCodecSizePrefix(getUtf8Codec(), getU32Codec());
const bytes = codec.encode("hello");
// 0x0500000068656c6c6f
const value = codec.decode(bytes);
// "hello"
 
// 用于自定义对象的可变大小编解码器。
type Person = { name: string; age: number };
const codec: Codec<PersonInput, Person> = getStructCodec([
    ['name', addCodecSizePrefix(getUtf8Codec(), getU32Codec())],
    ['age', getU32Codec()],
]);
const bytes = codec.encode({ name: "Bob", age: 42 });
// 0x03000000426f622a000000
const value = codec.decode(bytes);
// { name: "Bob", age: 42 }

参见

调用签名

createCodec<TFrom, TTo>(codec): VariableSizeCodec<TFrom, TTo>

通过使用提供的 writeread 函数填充缺失的 encodedecode 函数来创建一个 Codec

此实用程序结合了 createEncodercreateDecoder 的行为,以生成一个功能齐全的 Codecencode 方法派生自 write 函数,而 decode 方法派生自 read 函数。

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

类型参数

类型参数默认类型描述
TFrom-要编码的值的类型。
TToTFrom解码后的值的类型。

参数

参数类型描述
codecOmit<VariableSizeCodec<TFrom, TTo>, "decode" | "encode">一个实现了 writeread,但没有实现 encodedecode 的编解码器对象。 - 如果编解码器具有 fixedSize 属性,则将其视为 FixedSizeCodec。 - 否则,将其视为 VariableSizeCodec

返回值

VariableSizeCodec<TFrom, TTo>

一个功能齐全的 Codec,具有 writereadencodedecode 方法。

示例

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

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

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

const codec = createCodec({
    getSizeFromValue: (value: string) => value.length,
    read: (bytes, offset) => {
        const decodedValue = new TextDecoder().decode(bytes.subarray(offset));
        return [decodedValue, bytes.length];
    },
    write: (value: string, bytes, offset) => {
        const encodedValue = new TextEncoder().encode(value);
        bytes.set(encodedValue, offset);
        return offset + encodedValue.length;
    },
});
 
const bytes = codec.encode("hello");
// 0x68656c6c6f
const value = codec.decode(bytes);
// "hello"

备注

此函数有效地结合了 createEncodercreateDecoder 的行为。 如果您只需要编码或解码(但不同时需要),请考虑改用这些函数。

以下是一些使用编解码器原语而不是 createCodec 的替代示例。

// 用于无符号 32 位整数的固定大小编解码器。
const codec = getU32Codec();
const bytes = codec.encode(42);
// 0x2a000000
const value = codec.decode(bytes);
// 42
 
// 用于 32 字节前缀的 UTF-8 字符串的可变大小编解码器。
const codec = addCodecSizePrefix(getUtf8Codec(), getU32Codec());
const bytes = codec.encode("hello");
// 0x0500000068656c6c6f
const value = codec.decode(bytes);
// "hello"
 
// 用于自定义对象的可变大小编解码器。
type Person = { name: string; age: number };
const codec: Codec<PersonInput, Person> = getStructCodec([
    ['name', addCodecSizePrefix(getUtf8Codec(), getU32Codec())],
    ['age', getU32Codec()],
]);
const bytes = codec.encode({ name: "Bob", age: 42 });
// 0x03000000426f622a000000
const value = codec.decode(bytes);
// { name: "Bob", age: 42 }

参见

调用签名

createCodec<TFrom, TTo>(codec): Codec<TFrom, TTo>

通过使用提供的 writeread 函数填充缺失的 encodedecode 函数来创建一个 Codec

此实用程序结合了 createEncodercreateDecoder 的行为,以生成一个功能齐全的 Codecencode 方法派生自 write 函数,而 decode 方法派生自 read 函数。

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

类型参数

类型参数默认类型描述
TFrom-要编码的值的类型。
TToTFrom解码后的值的类型。

参数

参数类型描述
codecOmit<FixedSizeCodec<TFrom, TTo, number>, "encode" | "decode"> | Omit<VariableSizeCodec<TFrom, TTo>, "encode" | "decode">一个实现了 writeread,但没有实现 encodedecode 的编解码器对象。 - 如果编解码器具有 fixedSize 属性,则将其视为 FixedSizeCodec。 - 否则,将其视为 VariableSizeCodec

返回值

Codec<TFrom, TTo>

一个功能齐全的 Codec,具有 writereadencodedecode 方法。

示例

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

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

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

const codec = createCodec({
    getSizeFromValue: (value: string) => value.length,
    read: (bytes, offset) => {
        const decodedValue = new TextDecoder().decode(bytes.subarray(offset));
        return [decodedValue, bytes.length];
    },
    write: (value: string, bytes, offset) => {
        const encodedValue = new TextEncoder().encode(value);
        bytes.set(encodedValue, offset);
        return offset + encodedValue.length;
    },
});
 
const bytes = codec.encode("hello");
// 0x68656c6c6f
const value = codec.decode(bytes);
// "hello"

备注

此函数有效地结合了 createEncodercreateDecoder 的行为。 如果您只需要编码或解码(但不同时需要),请考虑改用这些函数。

以下是一些使用编解码器原语而不是 createCodec 的替代示例。

// 用于无符号 32 位整数的固定大小编解码器。
const codec = getU32Codec();
const bytes = codec.encode(42);
// 0x2a000000
const value = codec.decode(bytes);
// 42
 
// 用于 32 字节前缀的 UTF-8 字符串的可变大小编解码器。
const codec = addCodecSizePrefix(getUtf8Codec(), getU32Codec());
const bytes = codec.encode("hello");
// 0x0500000068656c6c6f
const value = codec.decode(bytes);
// "hello"
 
// 用于自定义对象的可变大小编解码器。
type Person = { name: string; age: number };
const codec: Codec<PersonInput, Person> = getStructCodec([
    ['name', addCodecSizePrefix(getUtf8Codec(), getU32Codec())],
    ['age', getU32Codec()],
]);
const bytes = codec.encode({ name: "Bob", age: 42 });
// 0x03000000426f622a000000
const value = codec.decode(bytes);
// { name: "Bob", age: 42 }

参见

On this page