Codec în Dart

Clasa de bază pentru perechi encode/decode (utf8, base64, json); fuse le leagă în lanț, inverted le inversează.

Sintaxă
abstract class Codec<S, T>
T encode(S input)
S decode(T encoded)
Codec<S, R> fuse<R>(Codec<T, R> other)
Codec<T, S> get inverted

Ce face Codec

Un Codec<S, T> are un encoder (din S în T) și un decoder (înapoi). utf8 este un Codec<String, List<int>>, base64 este Codec<List<int>, String>, iar json este Codec<Object?, String>.

a.fuse(b) creează un codec nou care aplică întâi a, apoi b la codificare (și în ordine inversă la decodare). De exemplu utf8.fuse(base64) transformă textul direct în Base64. Tipul de ieșire al primului trebuie să fie tipul de intrare al celui de-al doilea.

inverted returnează codec-ul cu rolurile schimbate: ce era decode devine encode. Poți scrie și propriile codec-uri, extinzând Codec și dând un encoder și un decoder.

Parametri

Parametru Descriere
other La fuse: codec-ul aplicat după cel curent.

Ce returnează

fuse: un codec combinat. inverted: codec-ul inversat.

Exemple

Exemplul 1: Text în Base64 dintr-un singur pas

import 'dart:convert';

void main() {
  final text64 = utf8.fuse(base64);
  final cod = text64.encode('Șoseaua Iași');
  print(cod);
  print(text64.decode(cod));
  print(text64.inverted.encode(cod));
}

Rezultat

yJhvc2VhdWEgSWHImWk=
Șoseaua Iași
Șoseaua Iași

Exemplul 2: JSON în octeți și înapoi

json.fuse(utf8) transformă obiectul în octeți gata de scris într-un fișier sau trimis prin rețea.

import 'dart:convert';

void main() {
  final jsonOcteti = json.fuse(utf8);
  final octeti = jsonOcteti.encode({'oras': 'Brăila', 'cod': 810000});
  print('${octeti.length} octeți');
  print(jsonOcteti.decode(octeti));
}

Rezultat

31 octeți
{oras: Brăila, cod: 810000}

Exemplul 3: Un codec propriu: inversarea textului

import 'dart:convert';

class Inversor extends Converter<String, String> {
  const Inversor();
  @override
  String convert(String input) => input.split('').reversed.join();
}

class CodecInvers extends Codec<String, String> {
  const CodecInvers();
  @override
  Converter<String, String> get encoder => const Inversor();
  @override
  Converter<String, String> get decoder => const Inversor();
}

void main() {
  const c = CodecInvers();
  final secret = c.encode('Constanța');
  print(secret);
  print(c.decode(secret));
  print(c.fuse(utf8).encode('Ana'));
}

Rezultat

ațnatsnoC
Constanța
[97, 110, 65]

Greșeli frecvente

  • Legi codec-uri ale căror tipuri nu se potrivesc: utf8.fuse(utf8) nu compilează, pentru că primul produce List<int>, iar al doilea primește String. Ieșirea primului trebuie să fie intrarea celui de-al doilea, ca la utf8.fuse(base64).

Comenzi înrudite

  • utf8: Codec-ul UTF-8: encode transformă textul în octeți, decode transformă octeții înapoi în text.
  • base64Encode: base64Encode transformă octeți în text Base64; base64Decode face invers, din text Base64 în octeți.
  • JsonEncoder.withIndent: Un convertor reutilizabil spre JSON; varianta withIndent scrie JSON frumos, pe mai multe rânduri, cu indentare.