dart Uint8List和List< int>有什么区别?

11dmarpk  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(503)

在我的flutter项目中,我有一些使用Uint8List的库(主要是加密技术),还有一些使用List<int>(grpc)的库。我想以最好的方式统一一堆与字节一起工作的函数。哪些情况适合Uint8List和List(在dart lang中,哪种方式更适合使用字节)?

t9eec4r0

t9eec4r01#

Uint8ListList<int>的特殊类型。正如the Uint8List documentation所解释的:
对于长列表,这种实现比默认的List实现具有更高的空间和时间效率。
存储在列表中的整数被截断到它们的低8位,被解释为值在0到255范围内的无符号8位整数。
您应该更喜欢使用Uint8List表示字节。有许多函数以List<int>的形式接受或返回字节序列,但这通常是由于历史原因,现在将这些API更改为使用Uint8List会破坏现有代码。(尝试更改API,但它破坏了比预期更多的代码,并且必须恢复对某些API的更改。
在函数返回字节序列为List<int>的情况下,通常返回的对象实际上是Uint8List,因此强制转换通常会起作用:

var list = foo() as Uint8List;

如果你不确定,你可以写一个helper函数,如果可能的话,它执行强制转换,但福尔斯将List<int>复制到一个新的Uint8List对象中:

import 'dart:typed_data';

/// Converts a `List<int>` to a [Uint8List].
///
/// Attempts to cast to a [Uint8List] first to avoid creating an unnecessary
/// copy.
extension AsUint8List on List<int> {
  Uint8List asUint8List() {
    final self = this; // Local variable to allow automatic type promotion.
    return (self is Uint8List) ? self : Uint8List.fromList(this);
  }
}

并将其用作:

var list = foo().asUint8List();

(The asUint8List()扩展也可以通过我的dartbag包获得。)

相关问题