跳到主要内容

BatteryStatusArray

数据结构

字节索引类型字段含义
0-1uint16电池数量
2-3uint16保留字段,必须为 0
4-...BatteryStatus 数组电池状态数组,按顺序连续存放

单个 BatteryStatus 是变长结构,因此数组不能按固定步长随机访问,需要从第一个元素开始按每个元素的 temp_count 顺序解析。总长度为 4+i=0battery_count1(20+temp_counti×4)4 + \sum_{i=0}^{battery\_count-1}(20 + temp\_count_i \times 4) 字节

示例

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;
}
}