在我的颤振项目中,我有一些使用Uint8List的库(主要是密码学的东西),还有一些正在使用List<int>的库。我想以最好的方式统一使用字节的一组函数。哪些情况适合于Uint8List和List (哪种方式更适合使用dart lang中的字节)?
发布于 2021-09-07 16:10:37
Uint8List是List<int>的一种特殊类型。如the Uint8List documentation所解释
对于长列表,此实现比默认的
实现具有更大的空间和时间效率。
存储在列表中的整数被截断为其低8位,解释为无符号8位整数,其值在0到255之间。
您应该更喜欢对字节使用Uint8List。有许多函数接受或返回字节序列作为List<int>,但通常是出于历史原因,现在将这些API更改为使用Uint8List将破坏现有的代码。(有人试图更改API,但它破坏了比预期更多的代码,必须恢复对一些API的更改。)
在函数以List<int>形式返回字节序列的情况下,通常返回的对象实际上是一个Uint8List,因此转换它通常是有效的:
var list = foo() as Uint8List;如果您不确定,可以编写一个助手函数,如果可能的话执行强制转换,但返回到将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();https://stackoverflow.com/questions/69090275
复制相似问题