将两个 16 位寄存器转换为 32 位浮点值 flutter
Convert two 16 Bit Registers to 32 Bit float value flutter
我正在使用 Modbus flutter 库,读取我获得的 2 个寄存器:
[16177, 4660] 我需要一个函数将其转换为 32 位浮点值:0.7
我找到了这个函数
ByteBuffer buffer = new Uint16List.fromList(fileBytes).buffer;
ByteData byteData = new ByteData.view(buffer);
double x = byteData.getFloat32(0);
它说 0.000045747037802357227 交换字节值
你能帮忙吗
我总是发现从字节数组开始并向其中插入内容最简单。发生的事情是您的代码默认为本机字节顺序(显然 little
),但您需要以大字节顺序执行此操作。
这是一个过于冗长的解决方案,您可以删除打印语句(和十六进制编解码器)
import 'dart:typed_data';
import 'package:convert/convert.dart'; // only needed for debugging
void main() {
final registers = [16177, 4660];
final bytes = Uint8List(4); // start with the 4 bytes = 32 bits
var byteData = bytes.buffer.asByteData(); // ByteData lets you choose the endianness
byteData.setInt16(0, registers[0], Endian.big); // Note big is the default here, but shown for completeness
byteData.setInt16(2, registers[1], Endian.big);
print(bytes); // just for debugging - does my byte order look right?
print(hex.encode(bytes)); // ditto
final f32 = byteData.getFloat32(0, Endian.big);
print(f32);
}
我正在使用 Modbus flutter 库,读取我获得的 2 个寄存器:
[16177, 4660] 我需要一个函数将其转换为 32 位浮点值:0.7
我找到了这个函数
ByteBuffer buffer = new Uint16List.fromList(fileBytes).buffer;
ByteData byteData = new ByteData.view(buffer);
double x = byteData.getFloat32(0);
它说 0.000045747037802357227 交换字节值
你能帮忙吗
我总是发现从字节数组开始并向其中插入内容最简单。发生的事情是您的代码默认为本机字节顺序(显然 little
),但您需要以大字节顺序执行此操作。
这是一个过于冗长的解决方案,您可以删除打印语句(和十六进制编解码器)
import 'dart:typed_data';
import 'package:convert/convert.dart'; // only needed for debugging
void main() {
final registers = [16177, 4660];
final bytes = Uint8List(4); // start with the 4 bytes = 32 bits
var byteData = bytes.buffer.asByteData(); // ByteData lets you choose the endianness
byteData.setInt16(0, registers[0], Endian.big); // Note big is the default here, but shown for completeness
byteData.setInt16(2, registers[1], Endian.big);
print(bytes); // just for debugging - does my byte order look right?
print(hex.encode(bytes)); // ditto
final f32 = byteData.getFloat32(0, Endian.big);
print(f32);
}