convert method

  1. @override
Uint8List convert(
  1. Uint8List input
)
override

Converts input and returns the result of the conversion.

Implementation

@override
Uint8List convert(Uint8List input) {
  final output = Uint8List(_maxEncodedLen(input.length) + 2);

  var outputOffset = 0;
  var inputOffset = 0;

  while (inputOffset < input.length) {
    output[outputOffset + 0] = 0;
    output[outputOffset + 1] = 0;
    output[outputOffset + 2] = 0;
    output[outputOffset + 3] = 0;
    output[outputOffset + 4] = 0;

    // Unpack 4 bytes into int to repack into base 85 5-byte.
    var value = 0;

    switch (input.length - inputOffset) {
      case 3:
        value |= input[inputOffset + 0] << 24;
        value |= input[inputOffset + 1] << 16;
        value |= input[inputOffset + 2] << 8;
        break;
      case 2:
        value |= input[inputOffset + 0] << 24;
        value |= input[inputOffset + 1] << 16;
        break;
      case 1:
        value |= input[inputOffset + 0] << 24;
        break;
      default:
        value |= input[inputOffset + 0] << 24;
        value |= input[inputOffset + 1] << 16;
        value |= input[inputOffset + 2] << 8;
        value |= input[inputOffset + 3];
    }

    // Special case: zero (!!!!!) shortens to z.
    if (value == 0 && input.length - inputOffset >= 4) {
      output[outputOffset] = 122;
      outputOffset++;
      inputOffset += 4;
      continue;
    }

    // Otherwise, 5 base 85 digits starting at !.
    for (var i = 4; i >= 0; i--) {
      output[outputOffset + i] = 33 + value % 85;
      value ~/= 85;
    }

    if (input.length - inputOffset < 4) {
      // If input was short, discard the low destination bytes.
      outputOffset += input.length - inputOffset + 1;
      break;
    }

    inputOffset += 4;
    outputOffset += 5;
  }

  // Add final "~>"
  output[outputOffset++] = 126;
  output[outputOffset++] = 62;

  return output.sublist(0, outputOffset);
}