Uint8List 在 flutter dart 中加倍
Uint8List to double in flutter dart
我正在使用 flutter 蓝牙串口包从微控制器接收数据。当我从微控制器发送整数值时,我得到以下形式的值:
[64], [144, 22]] 列表中的最后一个数字 (22) 是我发送的实际数字。但是,每次我发送任何值时,我也会得到这两个值 [64]、[144,...]。
另一件事是当我从微控制器发送一个浮点值时,我收到它作为 int 并且当我尝试将数据类型转换为双精度时,我得到这样的错误:
The argument type 'void Function(double)' can't be assigned to the parameter type 'void Function(Uint8List)?'.
The argument type 'double' can't be assigned to the parameter type 'List'.
下面是出现第一个错误的代码片段
List<List<double>> chunks = <List<double>>[];
_getBTConnection(){
BluetoothConnection.toAddress(widget.server.address).then((_connection){
connection = _connection;
isConnecting = false;
isDisconnecting = false;
setState(() {});
connection.input?.listen(_onDataReceived).onDone(() {
if(isDisconnecting){
print("Disconnecting locally");
}else{
print("Disconnecting remotely");
}
if(mounted){
setState(() {});
}
Navigator.of(context).pop();
});
}).catchError((error){
Navigator.of(context).pop();
});
}
下面是第二个错误的片段:
void _onDataReceived(double data){
if(data != null && data > 0){
chunks.add(data);
}
if (kDebugMode) {
print(" chunks: , $chunks " );
}
}
如果您在 Uint8List
中有一个 8(8 位)字节序列,您可以获得它的 ByteBuffer
or ByteData
视图以将这些字节解析为 64 位 double
.
例如:
import 'dart:typed_data';
void main() {
// Big-endian byte sequence for pi.
// See <https://en.wikipedia.org/wiki/Double-precision_floating-point_format>
var bytes =
Uint8List.fromList([0x40, 0x09, 0x21, 0xFB, 0x54, 0x44, 0x2D, 0x18]);
var doubleValue = bytes.buffer.asByteData().getFloat64(0);
print(doubleValue); // Prints: 3.141592653589793
}
尝试使用此代码将 Uint8List
转换为 List<double>
List<double> convertUint8ListToDoubleList(Uint8List uint8list) {
var bdata = ByteData.view(uint8list.buffer);
return List.generate(
(uint8list.length / 8).round(), (index) => bdata.getFloat64(index * 8));
}
您流中的数据类型是 Uint8List 吗?如果是Uint8List,你试过这段代码吗?
void _onDataReceived(Uint8List data){
if(data != null){
chunks.add(convertUint8ListToDoubleList(data));
}
if (kDebugMode) {
print(" chunks: , $chunks " );
}
}
如果您使用 List<double>chunks=[]
,请使用 List<double> convertUint8ListToDoubleList(Uint8List uint8list)
。
我正在使用 flutter 蓝牙串口包从微控制器接收数据。当我从微控制器发送整数值时,我得到以下形式的值: [64], [144, 22]] 列表中的最后一个数字 (22) 是我发送的实际数字。但是,每次我发送任何值时,我也会得到这两个值 [64]、[144,...]。 另一件事是当我从微控制器发送一个浮点值时,我收到它作为 int 并且当我尝试将数据类型转换为双精度时,我得到这样的错误:
The argument type 'void Function(double)' can't be assigned to the parameter type 'void Function(Uint8List)?'.
The argument type 'double' can't be assigned to the parameter type 'List'.
下面是出现第一个错误的代码片段
List<List<double>> chunks = <List<double>>[];
_getBTConnection(){
BluetoothConnection.toAddress(widget.server.address).then((_connection){
connection = _connection;
isConnecting = false;
isDisconnecting = false;
setState(() {});
connection.input?.listen(_onDataReceived).onDone(() {
if(isDisconnecting){
print("Disconnecting locally");
}else{
print("Disconnecting remotely");
}
if(mounted){
setState(() {});
}
Navigator.of(context).pop();
});
}).catchError((error){
Navigator.of(context).pop();
});
}
下面是第二个错误的片段:
void _onDataReceived(double data){
if(data != null && data > 0){
chunks.add(data);
}
if (kDebugMode) {
print(" chunks: , $chunks " );
}
}
如果您在 Uint8List
中有一个 8(8 位)字节序列,您可以获得它的 ByteBuffer
or ByteData
视图以将这些字节解析为 64 位 double
.
例如:
import 'dart:typed_data';
void main() {
// Big-endian byte sequence for pi.
// See <https://en.wikipedia.org/wiki/Double-precision_floating-point_format>
var bytes =
Uint8List.fromList([0x40, 0x09, 0x21, 0xFB, 0x54, 0x44, 0x2D, 0x18]);
var doubleValue = bytes.buffer.asByteData().getFloat64(0);
print(doubleValue); // Prints: 3.141592653589793
}
尝试使用此代码将 Uint8List
转换为 List<double>
List<double> convertUint8ListToDoubleList(Uint8List uint8list) {
var bdata = ByteData.view(uint8list.buffer);
return List.generate(
(uint8list.length / 8).round(), (index) => bdata.getFloat64(index * 8));
}
您流中的数据类型是 Uint8List 吗?如果是Uint8List,你试过这段代码吗?
void _onDataReceived(Uint8List data){
if(data != null){
chunks.add(convertUint8ListToDoubleList(data));
}
if (kDebugMode) {
print(" chunks: , $chunks " );
}
}
如果您使用 List<double>chunks=[]
,请使用 List<double> convertUint8ListToDoubleList(Uint8List uint8list)
。