Skip to content
Universal conversion of Uint8Array from/into UTF-8, base64url and hex in the browser and Node.js
TypeScript
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
src
.env.example
.gitignore
.npmignore
.travis.yml
LICENSE
README.md
nodemon.json
package.json
tsconfig.json
yarn.lock

README.md

@47ng/codec

NPM MIT License Travis CI Build Dependabot Status Average issue resolution time Number of open issues

Universal conversion of Uint8Array from/into UTF-8, base64url and hex in the browser and Node.js

Installation

$ yarn add @47ng/codec
# or
$ npm i @47ng/codec

Features

Available codecs:

Watch out ! utf8 uses a different convention than the other codecs (encode and decode are swapped), to reflect how TextEncoder and TextDecoder behave.

Examples

import { b64, hex, utf8 } from '@47ng/codec'

b64.encode(utf8.encode('Hello, World !')) // SGVsbG8sIFdvcmxkICE=
hex.encode(b64.decode('SGVsbG8sIFdvcmxkICE=')) // 48656c6c6f2c20576f726c642021
utf8.decode(hex.decode('48656c6c6f2c20576f726c642021')) // Hello, World !

b64.decode('SGVsbG8sIFdvcmxkICE=') // <Buffer 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 20 21>

Documentation

UTF-8

  • utf8.encode: Convert an UTF-8 string into an array of bytes (Uint8Array)
  • utf8.decode: Convert an array of bytes into an UTF-8 string

Examples:

import { utf8 } from '@47ng/codec'

const uint8Array = utf8.encode('Hello, World!')
// Uint8Array [72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33]

const backToText = utf8.decode(uint8Array)
// 'Hello, World!'

Base 64

  • b64.encode: Convert an array of bytes into a base64url string
  • b64.decode: Convert a base64 string into an array of bytes
  • b64.urlSafe: Convert a standard base64 string to base64url
  • b64.urlUnsafe: Convert a base64url string to standard base64 dictionary

Note: For decoding, any dictionary is supported, and trailing padding (=) is optional.

Examples:

import { b64, utf8 } from '@47ng/codec'

const uint8Array = b64.decode('8J-Ri_CfjI0')
// Uint8Array [240, 159, 145, 139, 240, 159, 140, 141]

// Encoding always emits padding
const backToBase64 = b64.encode(uint8Array)
// '8J-Ri_CfjI0='

const asText = utf8.decode(uint8Array)
// '👋🌍'

Hex

  • hex.encode: Convert an array of bytes into a hex string
  • hex.decode: Convert a hex string into an array of bytes

Note: Decoding accepts any case (lowercase, uppercase, mixed).

Examples:

import { hex } from '@47ng/codec'

const uint8Array = hex.decode('48656C6C6F2C20576f726c642021')
// Uint8Array [72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33]

// Encoding is always lowercase
const backToBase64 = hex.encode(uint8Array)
// '48656c6c6f2c20576f726c642021'

Utilities

The library exports convenience methods for hex to/from base64 conversions:

import { hexToBase64url, base64ToHex } from '@47ng/codec'

const hex = base64ToHex('SGVsbG8sIFdvcmxkICE=')
// 48656c6c6f2c20576f726c642021

const b64 = hexToBase64url('48656c6c6f2c20576f726c642021')
// SGVsbG8sIFdvcmxkICE=

As well as encoder / decoder objects with strong TypeScript types, to help you build your own encoders & decoders:

import { encoders, decoders, Encoding } from '@47ng/codec'

// type Encoding = 'base64' | 'utf8' | 'hex'

function convert(
  input: string,
  inputEncoding: Encoding,
  outputEncoding: Encoding
): string {
  const decoder = decoders[inputEncoding]
  const encoder = encoders[outputEncoding]
  return encoder(decoder(input))
}

convert('Hello, World!', 'utf8', 'base64')
// SGVsbG8sIFdvcmxkICE

convert('Hello, World!', 'utf8', 'hex')
// 48656c6c6f2c20576f726c642021

License

MIT - Made with ❤️ by François Best.

You can’t perform that action at this time.