https://github.com/joeltg/big-varint
Encode and decode arbitrarily large signed and unsigned BigInts
https://github.com/joeltg/big-varint
bigint biginteger decoding encoding typescript variable-length-encoding varint
Last synced: about 1 year ago
JSON representation
Encode and decode arbitrarily large signed and unsigned BigInts
- Host: GitHub
- URL: https://github.com/joeltg/big-varint
- Owner: joeltg
- License: mit
- Created: 2021-06-29T15:14:23.000Z (almost 5 years ago)
- Default Branch: main
- Last Pushed: 2024-10-17T19:05:29.000Z (over 1 year ago)
- Last Synced: 2025-04-17T13:16:03.695Z (about 1 year ago)
- Topics: bigint, biginteger, decoding, encoding, typescript, variable-length-encoding, varint
- Language: TypeScript
- Homepage:
- Size: 367 KB
- Stars: 4
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# big-varint
[](https://github.com/RichardLitt/standard-readme) [](https://opensource.org/licenses/MIT) [](https://www.npmjs.com/package/big-varint) 
Encode and decode arbitrarily large signed and unsigned BigInts.
This library is TypeScript-native, ESM-only, and has zero dependencies. It uses Uint8Arrays and works in the browser, Node, and [Deno](https://deno.land/). It uses the same binary encoding as Go's [encoding/binary](https://pkg.go.dev/encoding/binary) module, the [Protobuf spec](https://developers.google.com/protocol-buffers/docs/encoding), and the [varint](https://www.npmjs.com/package/varint) / [signed-varint](https://www.npmjs.com/package/signed-varint) NPM packages.
## Table of Contents
- [Install](#install)
- [Usage](#usage)
- [Testing](#testing)
- [Credits](#credits)
- [Contributing](#contributing)
- [License](#license)
## Install
```
npm i big-varint
```
## Usage
### Encode a Signed Varint
```ts
import { encode } from "big-varint/signed"
const i = -300n
encode(i) // Uint8Array(2) [ 215, 4 ]
```
### Decode a Signed Varint
```ts
import { decode } from "big-varint/signed"
const data = new Uint8Array([215, 4])
decode(data) // -300n
```
`decode` can also be passed an optional `offset` parameter:
```ts
import { decode } from "big-varint/signed"
const data = new Uint8Array([0, 0, 215, 4, 37, 37, 37])
decode(data, 2) // -300n
// The encoding length of the most recently decoded value
// can be accessed via the `decode.bytes` property.
decode.bytes // 2
```
### Get the Encoding Length of a Signed Varint
```ts
import { encodingLength } from "big-varint/signed"
const i = -300n
encodingLength(i) // 2
```
### Encode an Unsigned Varint
```ts
import encode from "big-varint/unsigned"
const i = 123456789012345678901234567890n
encode(i)
/*
Uint8Array(14) [
210, 149, 252, 241,
228, 157, 248, 185,
195, 237, 191, 200,
238, 49
]
*/
```
### Decode an Unsigned Varint
```ts
import { decode } from "big-varint/unsigned"
const data = new Uint8Array([210, 149, 252, 241, 228, 157, 248, 185, 195, 237, 191, 200, 238, 49])
decode(data) // 123456789012345678901234567890n
```
`decode` can also be passed an optional `offset` parameter:
```typescript
import { decode } from "big-varint/unsigned"
const data = new Uint8Array([
0, 0, 0, 0, 210, 149, 252, 241, 228, 157, 248, 185, 195, 237, 191, 200, 238, 49, 37, 37, 0, 0,
])
decode(data, 4) // 123456789012345678901234567890n
// The encoding length of the most recently decoded value
// can be accessed via the `decode.bytes` property.
decode.bytes // 14
```
### Get the Encoding Length of an Unsigned Varint
```typescript
import { encodingLength } from "big-varint/unsigned"
const i = 123456789012345678901234567890n
encodingLength(i) // 14
```
## Testing
Tests use [AVA](https://github.com/avajs/ava) and live in the [test](./test/) directory.
```
npm run test
```
## Credits
A previous version of this library was adapted from [chrisdickinson/varint](https://github.com/chrisdickinson/varint), but has since been rewritten from scratch.
## Contributing
I don't expect to add any additional functionality to this library, but am potentially open to proposals for better interfaces. Open issues to discuss any questions before making an PRs.
## License
MIT © 2021 Joel Gustafson