Go语言读取累计行驶里程数据:实现和解析
Go语言读取累计行驶里程数据:实现和解析
本文将介绍如何使用Go语言读取和解析车辆累计行驶里程数据。我们将定义一个数据结构来存储里程信息,并实现一个函数来从数据块中提取里程数据。
数据结构
首先,我们定义一个名为Mileage的结构体来存储里程数据:
type Mileage struct {
RealDataTime string // 记录仪实时时间
InstallDataTime string // 记录仪安装时间
InitialMileage float64 // 初始里程
Mileage float64 // 累计里程
}
读取里程数据
接下来,我们实现一个名为ReadMileage的函数,它接收一个DataBlock作为参数,并返回一个Mileage结构体和一个错误。
// ReadMileage 4 读取《采集累计行驶里程》数据
func ReadMileage(block DataBlock) (Mileage, error) {
mileage := Mileage{}
if block.Len == 20 {
if t1, e := formatDateTimeStr(block.Data[0:6]); e == nil {
mileage.RealDataTime = t1
//fmt.Println(t1)
}
if t2, e := formatDateTimeStr(block.Data[6:12]); e == nil {
mileage.InstallDataTime = t2
//fmt.Println(t2)
}
m1Str := BCDBytesToString(block.Data[12:16])
m1, _ := strconv.Atoi(m1Str)
mileage.InitialMileage, _ = decimal.NewFromFloat(float64(m1) * 0.1).Round(1).Float64()
m2Str := BCDBytesToString(block.Data[16:20])
m2, _ := strconv.Atoi(m2Str)
mileage.Mileage, _ = decimal.NewFromFloat(float64(m2) * 0.1).Round(1).Float64()
return mileage, nil
} else {
return Mileage{}, NewError(LENERROR, '《采集累计行驶里程》数据长度不正确')
}
}
代码解释
- 函数首先判断数据块长度是否为20字节,如果不是则返回错误。
- 如果数据块长度正确,函数会从数据块中提取实时时间、安装时间、初始里程和累计里程。
- 实时时间和安装时间使用
formatDateTimeStr函数从数据块中解析。 - 初始里程和累计里程使用
BCDBytesToString函数从数据块中解析,并使用decimal包进行精度控制。 - 最后,函数返回解析后的
Mileage结构体和一个nil错误。
总结
本篇文章介绍了如何使用Go语言读取和解析车辆累计行驶里程数据。通过定义数据结构和实现解析函数,我们可以方便地从数据块中提取里程信息。同时,我们也需要注意数据格式和错误处理,以确保程序的稳定性和可靠性。
C++ 等效实现
为了方便其他语言的用户参考,我们提供C++语言的等效实现。
struct Mileage {
std::string RealDataTime; // 记录仪实时时间
std::string InstallDataTime; // 记录仪安装时间
double InitialMileage; // 初始里程
double Mileage; // 累计里程
};
Mileage readMileage(DataBlock block) {
Mileage mileage;
if (block.Len == 20) {
if (auto t1 = formatDateTimeStr(block.Data.substr(0, 6)); !t1.empty()) {
mileage.RealDataTime = t1;
//std::cout << t1 << std::endl;
}
if (auto t2 = formatDateTimeStr(block.Data.substr(6, 6)); !t2.empty()) {
mileage.InstallDataTime = t2;
//std::cout << t2 << std::endl;
}
auto m1Str = bcdBytesToString(block.Data.substr(12, 4));
auto m1 = std::stoi(m1Str);
mileage.InitialMileage = decimal::decimal64_t{m1} * 0.1;
auto m2Str = bcdBytesToString(block.Data.substr(16, 4));
auto m2 = std::stoi(m2Str);
mileage.Mileage = decimal::decimal64_t{m2} * 0.1;
return mileage;
} else {
throw std::invalid_argument("《采集累计行驶里程》数据长度不正确");
}
}
注意: 此C++代码假设formatDateTimeStr和bcdBytesToString函数已经定义。
原文地址: https://www.cveoy.top/t/topic/ldP0 著作权归作者所有。请勿转载和采集!