summaryrefslogtreecommitdiff
path: root/std/encoding/binary.ts
diff options
context:
space:
mode:
Diffstat (limited to 'std/encoding/binary.ts')
-rw-r--r--std/encoding/binary.ts266
1 files changed, 0 insertions, 266 deletions
diff --git a/std/encoding/binary.ts b/std/encoding/binary.ts
deleted file mode 100644
index f62b3b7a4..000000000
--- a/std/encoding/binary.ts
+++ /dev/null
@@ -1,266 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-
-type RawBaseType = "int8" | "int16" | "int32" | "uint8" | "uint16" | "uint32";
-type RawNumberType = RawBaseType | "float32" | "float64";
-type RawBigType = RawBaseType | "int64" | "uint64";
-export type DataType = RawNumberType | RawBigType;
-
-/** How encoded binary data is ordered. */
-export type Endianness = "little" | "big";
-
-/** Options for working with the `number` type. */
-export interface VarnumOptions {
- /** The binary format used. */
- dataType?: RawNumberType;
- /** The binary encoding order used. */
- endian?: Endianness;
-}
-
-/** Options for working with the `bigint` type. */
-export interface VarbigOptions {
- /** The binary format used. */
- dataType?: RawBigType;
- /** The binary encoding order used. */
- endian?: Endianness;
-}
-
-const rawTypeSizes: Record<DataType, number> = {
- int8: 1,
- uint8: 1,
- int16: 2,
- uint16: 2,
- int32: 4,
- uint32: 4,
- int64: 8,
- uint64: 8,
- float32: 4,
- float64: 8,
-} as const;
-
-/** Number of bytes required to store `dataType`. */
-export function sizeof(dataType: DataType): number {
- return rawTypeSizes[dataType];
-}
-
-/** Reads `n` bytes from `r`.
- *
- * Resolves it in a `Uint8Array`, or throws `Deno.errors.UnexpectedEof` if `n` bytes cannot be read. */
-export async function getNBytes(
- r: Deno.Reader,
- n: number,
-): Promise<Uint8Array> {
- const scratch = new Uint8Array(n);
- const nRead = await r.read(scratch);
- if (nRead === null || nRead < n) throw new Deno.errors.UnexpectedEof();
- return scratch;
-}
-
-/** Decodes a number from `b`. If `o.bytes` is shorter than `sizeof(o.dataType)`, returns `null`.
- *
- * `o.dataType` defaults to `"int32"`. */
-export function varnum(b: Uint8Array, o: VarnumOptions = {}): number | null {
- o.dataType = o.dataType ?? "int32";
- const littleEndian = (o.endian ?? "big") === "little" ? true : false;
- if (b.length < sizeof(o.dataType)) return null;
- const view = new DataView(b.buffer);
- switch (o.dataType) {
- case "int8":
- return view.getInt8(0);
- case "uint8":
- return view.getUint8(0);
- case "int16":
- return view.getInt16(0, littleEndian);
- case "uint16":
- return view.getUint16(0, littleEndian);
- case "int32":
- return view.getInt32(0, littleEndian);
- case "uint32":
- return view.getUint32(0, littleEndian);
- case "float32":
- return view.getFloat32(0, littleEndian);
- case "float64":
- return view.getFloat64(0, littleEndian);
- }
-}
-
-/** Decodes a bigint from `b`. If `o.bytes` is shorter than `sizeof(o.dataType)`, returns `null`.
- *
- * `o.dataType` defaults to `"int64"`. */
-export function varbig(b: Uint8Array, o: VarbigOptions = {}): bigint | null {
- o.dataType = o.dataType ?? "int64";
- const littleEndian = (o.endian ?? "big") === "little" ? true : false;
- if (b.length < sizeof(o.dataType)) return null;
- const view = new DataView(b.buffer);
- switch (o.dataType) {
- case "int8":
- return BigInt(view.getInt8(0));
- case "uint8":
- return BigInt(view.getUint8(0));
- case "int16":
- return BigInt(view.getInt16(0, littleEndian));
- case "uint16":
- return BigInt(view.getUint16(0, littleEndian));
- case "int32":
- return BigInt(view.getInt32(0, littleEndian));
- case "uint32":
- return BigInt(view.getUint32(0, littleEndian));
- case "int64":
- return view.getBigInt64(0, littleEndian);
- case "uint64":
- return view.getBigUint64(0, littleEndian);
- }
-}
-
-/** Encodes number `x` into `b`. Returns the number of bytes used, or `0` if `b` is shorter than `sizeof(o.dataType)`.
- *
- * `o.dataType` defaults to `"int32"`. */
-export function putVarnum(
- b: Uint8Array,
- x: number,
- o: VarnumOptions = {},
-): number {
- o.dataType = o.dataType ?? "int32";
- const littleEndian = (o.endian ?? "big") === "little" ? true : false;
- if (b.length < sizeof(o.dataType)) return 0;
- const view = new DataView(b.buffer);
- switch (o.dataType) {
- case "int8":
- view.setInt8(0, x);
- break;
- case "uint8":
- view.setUint8(0, x);
- break;
- case "int16":
- view.setInt16(0, x, littleEndian);
- break;
- case "uint16":
- view.setUint16(0, x, littleEndian);
- break;
- case "int32":
- view.setInt32(0, x, littleEndian);
- break;
- case "uint32":
- view.setUint32(0, x, littleEndian);
- break;
- case "float32":
- view.setFloat32(0, x, littleEndian);
- break;
- case "float64":
- view.setFloat64(0, x, littleEndian);
- break;
- }
- return sizeof(o.dataType);
-}
-
-/** Encodes bigint `x` into `b`. Returns the number of bytes used, or `0` if `b` is shorter than `sizeof(o.dataType)`.
- *
- * `o.dataType` defaults to `"int64"`. */
-export function putVarbig(
- b: Uint8Array,
- x: bigint,
- o: VarbigOptions = {},
-): number {
- o.dataType = o.dataType ?? "int64";
- const littleEndian = (o.endian ?? "big") === "little" ? true : false;
- if (b.length < sizeof(o.dataType)) return 0;
- const view = new DataView(b.buffer);
- switch (o.dataType) {
- case "int8":
- view.setInt8(0, Number(x));
- break;
- case "uint8":
- view.setUint8(0, Number(x));
- break;
- case "int16":
- view.setInt16(0, Number(x), littleEndian);
- break;
- case "uint16":
- view.setUint16(0, Number(x), littleEndian);
- break;
- case "int32":
- view.setInt32(0, Number(x), littleEndian);
- break;
- case "uint32":
- view.setUint32(0, Number(x), littleEndian);
- break;
- case "int64":
- view.setBigInt64(0, x, littleEndian);
- break;
- case "uint64":
- view.setBigUint64(0, x, littleEndian);
- break;
- }
- return sizeof(o.dataType);
-}
-
-/** Decodes a number from `r`, consuming `sizeof(o.dataType)` bytes. If less than `sizeof(o.dataType)` bytes were read, throws `Deno.errors.unexpectedEof`.
- *
- * `o.dataType` defaults to `"int32"`. */
-export async function readVarnum(
- r: Deno.Reader,
- o: VarnumOptions = {},
-): Promise<number> {
- o.dataType = o.dataType ?? "int32";
- const scratch = await getNBytes(r, sizeof(o.dataType));
- return varnum(scratch, o) as number;
-}
-
-/** Decodes a bigint from `r`, consuming `sizeof(o.dataType)` bytes. If less than `sizeof(o.dataType)` bytes were read, throws `Deno.errors.unexpectedEof`.
- *
- * `o.dataType` defaults to `"int64"`. */
-export async function readVarbig(
- r: Deno.Reader,
- o: VarbigOptions = {},
-): Promise<bigint> {
- o.dataType = o.dataType ?? "int64";
- const scratch = await getNBytes(r, sizeof(o.dataType));
- return varbig(scratch, o) as bigint;
-}
-
-/** Encodes and writes `x` to `w`. Resolves to the number of bytes written.
- *
- * `o.dataType` defaults to `"int32"`. */
-export function writeVarnum(
- w: Deno.Writer,
- x: number,
- o: VarnumOptions = {},
-): Promise<number> {
- o.dataType = o.dataType ?? "int32";
- const scratch = new Uint8Array(sizeof(o.dataType));
- putVarnum(scratch, x, o);
- return w.write(scratch);
-}
-
-/** Encodes and writes `x` to `w`. Resolves to the number of bytes written.
- *
- * `o.dataType` defaults to `"int64"`. */
-export function writeVarbig(
- w: Deno.Writer,
- x: bigint,
- o: VarbigOptions = {},
-): Promise<number> {
- o.dataType = o.dataType ?? "int64";
- const scratch = new Uint8Array(sizeof(o.dataType));
- putVarbig(scratch, x, o);
- return w.write(scratch);
-}
-
-/** Encodes `x` into a new `Uint8Array`.
- *
- * `o.dataType` defaults to `"int32"` */
-export function varnumBytes(x: number, o: VarnumOptions = {}): Uint8Array {
- o.dataType = o.dataType ?? "int32";
- const b = new Uint8Array(sizeof(o.dataType));
- putVarnum(b, x, o);
- return b;
-}
-
-/** Encodes `x` into a new `Uint8Array`.
- *
- * `o.dataType` defaults to `"int64"` */
-export function varbigBytes(x: bigint, o: VarbigOptions = {}): Uint8Array {
- o.dataType = o.dataType ?? "int64";
- const b = new Uint8Array(sizeof(o.dataType));
- putVarbig(b, x, o);
- return b;
-}