branch:
encoding.ts
2565 bytesRaw
import type {
BufferEncoding,
ReadFileOptions,
WriteFileOptions
} from "./interface";
export type FileContent = string | Uint8Array;
const textEncoder = new TextEncoder();
const textDecoder = new TextDecoder();
export function toBuffer(
content: FileContent,
encoding?: BufferEncoding
): Uint8Array {
if (content instanceof Uint8Array) {
return content;
}
if (encoding === "base64") {
return Uint8Array.from(atob(content), (c) => c.charCodeAt(0));
}
if (encoding === "hex") {
const bytes = new Uint8Array(content.length / 2);
for (let i = 0; i < content.length; i += 2) {
bytes[i / 2] = parseInt(content.slice(i, i + 2), 16);
}
return bytes;
}
if (encoding === "binary" || encoding === "latin1") {
const chunkSize = 65536;
if (content.length <= chunkSize) {
return Uint8Array.from(content, (c) => c.charCodeAt(0));
}
const result = new Uint8Array(content.length);
for (let i = 0; i < content.length; i++) {
result[i] = content.charCodeAt(i);
}
return result;
}
return textEncoder.encode(content);
}
export function fromBuffer(
buffer: Uint8Array,
encoding?: BufferEncoding | null
): string {
if (encoding === "base64") {
if (typeof Buffer !== "undefined") {
return Buffer.from(buffer).toString("base64");
}
const chunkSize = 65536;
let binary = "";
for (let i = 0; i < buffer.length; i += chunkSize) {
const chunk = buffer.subarray(i, i + chunkSize);
binary += String.fromCharCode(...chunk);
}
return btoa(binary);
}
if (encoding === "hex") {
return Array.from(buffer)
.map((b) => b.toString(16).padStart(2, "0"))
.join("");
}
if (encoding === "binary" || encoding === "latin1") {
if (typeof Buffer !== "undefined") {
return Buffer.from(buffer).toString(encoding);
}
const chunkSize = 65536;
if (buffer.length <= chunkSize) {
return String.fromCharCode(...buffer);
}
let result = "";
for (let i = 0; i < buffer.length; i += chunkSize) {
const chunk = buffer.subarray(i, i + chunkSize);
result += String.fromCharCode(...chunk);
}
return result;
}
return textDecoder.decode(buffer);
}
export function getEncoding(
options?: ReadFileOptions | WriteFileOptions | BufferEncoding | string | null
): BufferEncoding | undefined {
if (options === null || options === undefined) {
return undefined;
}
if (typeof options === "string") {
return options as BufferEncoding;
}
return options.encoding ?? undefined;
}