convert function

List<int> convert(
  1. List<int> data,
  2. int inBits,
  3. int outBits,
  4. bool pad,
)

Taken from bech32 (bitcoinjs): https://github.com/bitcoinjs/bech32

Implementation

List<int> convert(List<int> data, int inBits, int outBits, bool pad) {
  var value = 0;
  var bits = 0;
  var maxV = (1 << outBits) - 1;

  var result = <int>[];
  for (var i = 0; i < data.length; ++i) {
    value = (value << inBits) | data[i];
    bits += inBits;

    while (bits >= outBits) {
      bits -= outBits;
      result.add((value >> bits) & maxV);
    }
  }

  if (pad) {
    if (bits > 0) {
      result.add((value << (outBits - bits)) & maxV);
    }
  } else {
    if (bits >= inBits) {
      throw Exception('Excess padding');
    }

    if ((value << (outBits - bits)) & maxV > 0) {
      throw Exception('Non-zero padding');
    }
  }

  return result;
}