JSPM

bits.js

0.1.1
  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 2
  • Score
    100M100P100Q35130F
  • License MIT

Conveniently encode and decode arbitrary-length binary data in BigIntegers

Package Exports

  • bits.js

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (bits.js) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

bits.js:

Conveniently encode and decode arbitrary-length binary data in BigIntegers. This can be useful to compress data for storage optimisation. For example, storing data is expensive on Ethereum and one may want to tightly data in 256 bits chunks.

Examples:

  • Store data related to a network request, on 128 bits
var layout = [
    {name: "reqid", bits: 32}, // 0-31
    {name: "ipv4",  bits: 32}, // 32-63
    {name: "ipv6",  bits: 64}  // 64-127
]

const object = {
    reqid: BigInt(/* value */),
    ipv4:  BigInt(/* value */),
    ipv6:  BigInt(/* value */)
}

Usage

Install

npm install bits.js

Define a Layout

var bits = require('bits.js');
var BigInteger = require('big-integer'); // to enable platforms not supporting native BigInt

var layout = [
    { name: "x", bits: 514 },
    { name: "y", bits: 56 },
    { name: "z", bits: 32 }
];

Encode an object into a BigInteger

var packed = bits.encode(layout, {
    x: BigInteger(123456789),
    y: bits.maxValue(56),
    z: BigInteger()
});
console.log(`0x${packed.toString(16)}`);
// 0x7fffffffffffff875bcd15

Decode a BigInteger into an object

const unpacked = bits.decode(layout,  BigInteger('FFF00FFFFFF00FFFFFFFFFF', 16));
console.log(JSON.stringify(unpacked));
// {"object":{"x":"2147483647","y":"71496843107631615","z":"31"}}

API

- bits.encode(layout, object)

  • returns the encoded BigInteger
  • throws if layout is invalid or if object is not compatible with layout

- bits.decode(layout, bigint)

  • returns the decoded object
  • throws if layout is invalid or if bigint is not compatible with layout

- BigInteger.maxValue(nbBits)

  • returns the max integer value which can be encoded on nbBits