BatteryStatusArray
数据结构
| 字节索引 | 类型 | 字段含义 |
|---|---|---|
| 0-1 | uint16 | 电池数量 |
| 2-3 | uint16 | 保留字段,必须为 0 |
| 4-... | BatteryStatus 数组 | 电池状态数组,按顺序连续存放 |
单个 BatteryStatus 是变长结构,因此数组不能按固定步长随机访问,需要从第一个元素开始按每个元素的 temp_count 顺序解析。总长度为 字节
示例
C++ 示例
struct BatteryStatusArrayHeader {
uint16_t battery_count;
uint16_t reserved;
};
struct BatteryStatusHeader {
uint32_t fault_code;
float voltage;
float current;
float soc;
uint16_t temp_count;
uint16_t reserved;
};
// payload = BatteryStatusArrayHeader + battery_count * variable-length BatteryStatus
Rust 示例
#[repr(C)]
#[derive(Clone, Copy, Debug, Default)]
pub struct BatteryStatusArrayHeader {
pub battery_count: u16,
pub reserved: u16,
}
#[repr(C)]
#[derive(Clone, Copy, Debug, Default)]
pub struct BatteryStatusHeader {
pub fault_code: u32,
pub voltage: f32,
pub current: f32,
pub soc: f32,
pub temp_count: u16,
pub reserved: u16,
}
const _: () = {
assert!(core::mem::size_of::<BatteryStatusArrayHeader>() == 4);
assert!(core::mem::size_of::<BatteryStatusHeader>() == 20);
};
Dart 示例
import 'dart:typed_data';
final class BatteryStatusArrayView {
static const int headerLength = 4;
static const int batteryStatusHeaderLength = 20;
static const int tempLength = Float32List.bytesPerElement;
final ByteBuffer buffer;
final ByteData header;
final int offsetInBytes;
BatteryStatusArrayView(this.buffer, [this.offsetInBytes = 0])
: header = ByteData.view(buffer, offsetInBytes, headerLength);
int get batteryCount => header.getUint16(0, Endian.little);
int batteryStatusOffset(int index) {
var currentOffset = offsetInBytes + headerLength;
for (var i = 0; i < index; i++) {
final data = ByteData.view(buffer, currentOffset, batteryStatusHeaderLength);
final tempCount = data.getUint16(16, Endian.little);
currentOffset += batteryStatusHeaderLength + tempCount * tempLength;
}
return currentOffset;
}
}
Java 示例
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
public final class BatteryStatusArrayView {
public static final int HEADER_LENGTH = 4;
public static final int BATTERY_STATUS_HEADER_LENGTH = 20;
public static final int TEMP_LENGTH = Float.BYTES;
private final ByteBuffer buffer;
private final int offset;
public BatteryStatusArrayView(ByteBuffer buffer, int offset) {
this.buffer = buffer.order(ByteOrder.LITTLE_ENDIAN);
this.offset = offset;
}
public int batteryCount() { return Short.toUnsignedInt(buffer.getShort(offset)); }
public int batteryStatusOffset(int index) {
int currentOffset = offset + HEADER_LENGTH;
for (int i = 0; i < index; i++) {
int tempCount = Short.toUnsignedInt(buffer.getShort(currentOffset + 16));
currentOffset += BATTERY_STATUS_HEADER_LENGTH + tempCount * TEMP_LENGTH;
}
return currentOffset;
}
}