我有一個 DART 二維陣列定義為
var matrix = List.generate(10, (i) =>List.filled(4, 0, growable: false),
growable: false);
我可以用亂數填充它
for (int i = 0; i < 10; i ) {
for (int j = 0; j < 4; j )
{
matrix[i][j] = random.nextInt(MaxRan);
}
}
我現在想使用各種 base64 和壓縮庫來處理這個陣列。如果我嘗試將其轉換為 Uint8List
Uint8List bytes = Uint8List.fromList(matrix);
我收到一條訊息說“ The argument type 'List<List<int>>' can't be assigned to the parameter type 'List<int>'”。
如何將串列分配給位元組結構?
謝謝你。
uj5u.com熱心網友回復:
如錯誤訊息所示,Uint8List可以從 a 構造List<int>,而不是從構造List<List<int>>。你有幾個選擇:
將所有子串列拼接成一個
List<int>,然后將其轉換為Uint8List:var flattened = [for (var row in matrix) ...row]; var bytes = Uint8List.fromList(flattened);創建
Uint8List具有總大小的 a 并從每個子串列中初始化其元素:var bytes = Uint8List(matrix.length * matrix[0].length); var byteOffset = 0; for (var row in matrix) { for (var cell in row) { bytes[byteOffset] = cell; byteOffset = 1; } }您還可以通過首先使用 a
Uint8List并提供輔助函式來訪問元素來避免額外的復制:class Matrix { final int rows; final int columns; final Uint8List data; Matrix({required this.rows, required this.columns}) : data = Uint8List(rows * columns); int getIndex(int row, int column) { if (row < 0 || row >= rows) { throw RangeError('row $row not in range [0, $rows)'); } if (column < 0 || column >= columns) { throw RangeError('column $column not in range [0, $columns)'); } return row * columns column; } int get(int row, int column) => data[getIndex(row, column)]; void set(int row, int column, int value) => data[getIndex(row, column)] = value; } void main() { var i = 0; var matrix = Matrix(rows: 10, columns: 4); for (var row = 0; row < matrix.rows; row = 1) { for (var column = 0; column < matrix.columns; column = 1) { matrix.set(row, column, i); i = 1; } } print(matrix.data); }
uj5u.com熱心網友回復:
您想在位元組陣列 ( Uint8List) 中存盤多大的數字?
我在這里采取的基本方法是
- 展平矩陣 (
List<List<int>>)- 這可以用
matrix.expand((v) => v)
- 這可以用
- 創建
Uint8List有足夠空間來容納所有矩陣元素- 這將是
rows倍cols倍然而,許多位元組需要存盤每個INT。
- 這將是
- 用于
setAll將矩陣中的元素放入Uint8List.
在下面的代碼中,我演示了如何使用幾種不同大小的整數來做到這一點。我還添加了一些代碼,顯示了如何可以將其重新從轉換Uint8List到List<List<int>>。
import 'dart:typed_data';
import 'dart:math';
void main() {
// setup original matrix
final random = Random();
const rows = 10;
const cols = 4;
const maxRan = 255;
var matrix = List.generate(rows, (i) => List.filled(cols, 0, growable: false),
growable: false);
for (int i = 0; i < rows; i ) {
for (int j = 0; j < cols; j ) {
matrix[i][j] = random.nextInt(maxRan);
}
}
print(matrix);
// convert matrix to Uint8list
// only works if maxRan is between 0 and 255
final asBytesInt8 = Uint8List(rows * cols)
..setAll(0, matrix.expand((v) => v));
// only works if maxRan is between 0 and 65535
final asBytesInt16 = Uint8List(2 * rows * cols)
..buffer.asUint16List().setAll(0, matrix.expand((v) => v));
// only works if maxRan is between 0 and 4294967295
final asBytesInt32 = Uint8List(4 * rows * cols)
..buffer.asUint32List().setAll(0, matrix.expand((v) => v));
print(' 8: $asBytesInt8');
print('16: $asBytesInt16');
print('32: $asBytesInt32');
// convert Uint8list back to matrix
final matrixFromInt8 = List.generate(
rows, (i) => List.filled(cols, 0, growable: false),
growable: false);
for (int i = 0; i < rows; i ) {
for (int j = 0; j < cols; j ) {
matrixFromInt8[i][j] = asBytesInt8[cols * i j];
}
}
final matrixFromInt16 = List.generate(
rows, (i) => List.filled(cols, 0, growable: false),
growable: false);
for (int i = 0; i < rows; i ) {
for (int j = 0; j < cols; j ) {
matrixFromInt16[i][j] =
asBytesInt16.buffer.asUint16List()[cols * i j];
}
}
final matrixFromInt32 = List.generate(
rows, (i) => List.filled(cols, 0, growable: false),
growable: false);
for (int i = 0; i < rows; i ) {
for (int j = 0; j < cols; j ) {
matrixFromInt32[i][j] =
asBytesInt32.buffer.asUint32List()[cols * i j];
}
}
print(' 8: $matrixFromInt8');
print('16: $matrixFromInt16');
print('32: $matrixFromInt32');
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/408824.html
標籤:
