| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- export enum Endian {
- BE = 'be',
- LE = 'le',
- }
- const UTF8_ENCODER = new TextEncoder();
- const UTF8_DECODER = new TextDecoder();
- function swapWord32Bytes(bytes: Uint8Array): Uint8Array {
- const out = new Uint8Array(bytes.length);
- let i = 0;
- for (; i + 4 <= bytes.length; i += 4) {
- out[i] = bytes[i + 3]!;
- out[i + 1] = bytes[i + 2]!;
- out[i + 2] = bytes[i + 1]!;
- out[i + 3] = bytes[i]!;
- }
- for (; i < bytes.length; i++) out[i] = bytes[i]!;
- return out;
- }
- /** 将小端数据转换为大端数据 */
- export function littleEndianToBigEndian(bytes: Uint8Array): Uint8Array {
- return swapWord32Bytes(bytes);
- }
- /** 将大端数据转换为小端数据 */
- export function bigEndianToLittleEndian(bytes: Uint8Array): Uint8Array {
- return swapWord32Bytes(bytes);
- }
- /** 将数字转为 4 字节二进制;endian 为 'be' 大端 或 'le' 小端 */
- export function numberToBytes(value: number, endian: Endian = Endian.BE): Uint8Array {
- const buf = new Uint8Array(4);
- numberToBytesAt(value, buf, 0, endian);
- return buf;
- }
- /** 在 buffer 的 offset 处写入 4 字节无符号整数 */
- export function numberToBytesAt(
- value: number,
- buffer: Uint8Array,
- offset: number,
- endian: Endian = Endian.BE
- ): void {
- if (endian === Endian.BE) {
- buffer[offset] = (value >>> 24) & 0xff;
- buffer[offset + 1] = (value >>> 16) & 0xff;
- buffer[offset + 2] = (value >>> 8) & 0xff;
- buffer[offset + 3] = value & 0xff;
- } else {
- buffer[offset] = value & 0xff;
- buffer[offset + 1] = (value >>> 8) & 0xff;
- buffer[offset + 2] = (value >>> 16) & 0xff;
- buffer[offset + 3] = (value >>> 24) & 0xff;
- }
- }
- /** 从 buffer 的 offset 处读取 4 字节无符号整数 */
- export function bytesToNumber(
- buffer: Uint8Array,
- offset: number,
- endian: Endian = Endian.BE
- ): number {
- if (endian === 'be') {
- return (
- ((buffer[offset]! << 24) |
- (buffer[offset + 1]! << 16) |
- (buffer[offset + 2]! << 8) |
- buffer[offset + 3]!) >>>
- 0
- );
- }
- return (
- (buffer[offset]! |
- (buffer[offset + 1]! << 8) |
- (buffer[offset + 2]! << 16) |
- (buffer[offset + 3]! << 24)) >>>
- 0
- );
- }
- /** 将 UTF-8 字符串转为二进制 */
- export function stringToBytes(str: string): Uint8Array {
- return UTF8_ENCODER.encode(str);
- }
- /** 将 UTF-8 二进制转为字符串 */
- export function bytesToString(bytes: Uint8Array): string {
- return UTF8_DECODER.decode(bytes);
- }
|