MeasurementSeries.fromBytes constructor

MeasurementSeries.fromBytes(
  1. Uint8List bytes
)

Implementation

factory MeasurementSeries.fromBytes(Uint8List bytes) {
  var offset = 0;

  final labelLength = bytes.buffer.asUint16List(offset, 1).single;
  offset += Uint16List.bytesPerElement;

  // The data isn't 16-bit aligned, so we need to first create a copy
  // of the list that is just bytes, and then look at its buffer
  // as a 16-bit list.
  final labelBytes =
      Uint8List.fromList(bytes.buffer.asUint8List(offset, labelLength))
          .buffer
          .asUint16List();
  final label = String.fromCharCodes(labelBytes);
  offset += labelBytes.lengthInBytes;

  final measurementLength = Uint8List.fromList(
          bytes.buffer.asUint8List(offset, Uint64List.bytesPerElement))
      .buffer
      .asUint64List()
      .single;
  offset += Uint64List.bytesPerElement;

  final measurementZippedBytes =
      bytes.buffer.asUint8List(offset, measurementLength);
  final measurementUnzippedBytes = lzma.decode(measurementZippedBytes);
  final measurements =
      Uint8List.fromList(measurementUnzippedBytes).buffer.asInt64List();

  assert(
      bytes.lengthInBytes ==
          Uint16List.bytesPerElement +
              labelLength +
              Uint64List.bytesPerElement +
              measurementLength,
      'The data length of $bytes is not equivalent to the sum of its parts');

  return MeasurementSeries(label, measurements);
}