convertBits function

List<int>? convertBits(
  1. List<int> data,
  2. int from,
  3. int to,
  4. bool pad,
)

Converts data from "from" bits to "to" bits with optional padding (pad). Returns the new data or null if conversion was not possible. Used to convert to and from the 5-bit words for bech32.

Implementation

List<int>? convertBits(List<int> data, int from, int to, bool pad) {

  var acc = 0;
  var bits = 0;
  List<int> result = [];
  final maxv = (1 << to) - 1;

  for (final v in data) {
    if (v < 0 || (v >> from) != 0) return null;
    acc = (acc << from) | v;
    bits += from;
    while (bits >= to) {
      bits -= to;
      result.add((acc >> bits) & maxv);
    }
  }

  if (pad) {
    if (bits > 0) {
      result.add((acc << (to - bits)) & maxv);
    }
  } else if (bits >= from || ((acc << (to - bits)) & maxv) != 0) {
    return null;
  }

  return result;

}