convertBits function
Implementation
List<int> convertBits(data, int from, int to, {bool strictMode = false}) {
double len = data.length * from / to;
final length = strictMode ? len.floor() : len.ceil();
final mask = (1 << to) - 1;
final result = List.generate(length, (_) => 0);
var index = 0;
var accumulator = 0;
var bits = 0;
for (var i = 0; i < data.length; i++) {
final value = data[i] as int;
if (value < 0 || value >> from != 0) {
throw ArgumentError('Input value $value exceeds $from bits');
}
accumulator = (accumulator << from) | value;
bits += from;
while (bits >= to) {
bits -= to;
result[index] = (accumulator >> bits) & mask;
index++;
}
}
if (!strictMode) {
if (bits > 0) {
result[index] = (accumulator << (to - bits)) & mask;
}
} else if (bits >= from || ((accumulator << (to - bits)) & mask) != 0) {
throw ArgumentError('Invalid padding');
}
return result;
}