convert method

  1. @override
List<int> convert(
  1. covariant List<int> encoded
)
override

Converts encoded array of numbers with bit-length of source to an array of numbers with bit-length of target. The encoded array will be treated as a sequence of bits to convert.

If the encoded array contains negative numbers or numbers having more than the source bits, it will be treated as the end of the input sequence.

After consuming all of input sequence, if there are some non-zero partial word remains, it will throw FormatException.

Implementation

@override
List<int> convert(covariant List<int> encoded) {
  int x, p, s, t, l, n, sb, tb;
  sb = source;
  tb = target;
  if (sb < 2 || sb > 64) {
    throw ArgumentError('The source bit length should be between 2 to 64');
  }
  if (tb < 2 || tb > 64) {
    throw ArgumentError('The target bit length should be between 2 to 64');
  }

  l = encoded.length * sb;
  var out = Uint8List(l ~/ tb);

  // generate words from the input bits
  p = n = t = l = 0;
  s = 1 << (sb - 1);
  s = s ^ (s - 1);
  for (x in encoded) {
    if (x < 0 || x > s) break;
    p = (p << sb) ^ x;
    t = (t << sb) ^ s;
    n += sb;
    while (n >= tb) {
      n -= tb;
      out[l++] = p >>> n;
      t >>>= tb;
      p &= t;
    }
  }

  // p > 0 means that there is a non-zero partial word remaining
  if (p > 0) {
    throw FormatException('Invalid length');
  }

  if (l < out.length) {
    return out.sublist(0, l);
  }
  return out;
}