如何在dart2js之后将二进制数据转换为utf8字符串

时间:2015-02-06 06:38:31

标签: utf-8 binary dart

我将我的数据存储在localStorage中。因为我存储了大量数据,所以我需要压缩它。我是用GZip做的。一切正常,但我发现我从List转换GZip到Utf8的结果非常慢。在500k的数据上,在快速计算机上最多可能需要5分钟。

问题主要出现在加载功能中。

负载:

import 'dart:convert';
import 'package:archive/archive.dart';
import 'package:crypto/crypto.dart';

var base64 = CryptoUtils.base64StringToBytes(window.localStorage[storageName]);
var decompress = new GZipDecoder().decodeBytes(base64);
storage = JSON.decode(new Utf8Decoder().convert(decompress));

保存

var g = JSON.encode(storage);
List<int> bz2 = new GZipEncoder().encode(new Utf8Encoder().convert(g));
window.localStorage[storageName] = CryptoUtils.bytesToBase64(bz2);

我做错了吗?还有其他方法将List转换为Dart中的String吗?另外,我同时保存和加载,因此不需要utf8。

我尝试过Ascii,但是对于不受支持的角色会抛出错误。我有点工作latin1,性能要高得多,但我仍然得到一些不受支持的角色。

2 个答案:

答案 0 :(得分:3)

如果UTF-8确实是瓶颈,并且你不需要它,你可以使用Dart的原生字符串编码UTF-16。

var compressed = new GZipEncoder().encode(str.codeUnits);
var decompressed = new GZipDecoder().decodeBytes(compressed);
var finalStr = new String.fromCharCodes(decompressed);

答案 1 :(得分:0)

这只是一个黑客而且不是最好的,但是它有效并且它现在给了我很好的表现:

String convertListIntToUtf8(List<int> codeUnits) {
  var endIndex = codeUnits.length;
  StringBuffer buffer = new StringBuffer();
  int i = 0;
  while (i < endIndex) {
    var c = codeUnits[i];
    if (c < 0x80) {
      buffer.write(new String.fromCharCode(c));
      i += 1;
    } else if (c < 0xE0) {
      buffer.write(new String.fromCharCode((c << 6) + codeUnits[i+1] - 0x3080));
      i += 2;
    } else if (c < 0xF0) {
      buffer.write(new String.fromCharCode((c << 12) + (codeUnits[i+1] << 6) + codeUnits[i+2] - 0xE2080));
      i += 3;
    } else {
      buffer.write(new String.fromCharCode((c << 18) + (codeUnits[i+1] << 12) + (codeUnits[i+2] << 6) + codeUnits[i+3] - 0x3C82080));
      i += 4;
    }
    if (i >= endIndex) break;
  }
  return buffer.toString();
}