63 {
65
66
68 for (; data_start !=
data_; --data_start) {
69 if (*data_start == '$') {
70 break;
71 }
72 }
73 if (data_start !=
data_) {
74 AWARN <<
"HUACE message has been truncated: " <<
data_;
75 }
76
77 if (*data_start != '$') {
78 input_str_.append(reinterpret_cast<const char *>(data_start),
80 } else {
81 input_str_.assign(reinterpret_cast<const char *>(data_start),
83 }
84
86 AWARN <<
"HUACE ASCII message is not complete: " << data_start;
87 return false;
88 }
89
90 std::vector<std::string> fields;
91 std::stringstream ss(input_str_.substr(0, input_str_.rfind('*')));
92 for (std::string field; std::getline(ss, field, ',');) {
93 fields.push_back(field);
94 }
95 if (fields.empty()) {
96 return false;
97 }
98 auto valid_fields = [&]() -> bool {
99 for (size_t i = 1; i < fields.size(); ++i) {
100 if (fields[i].empty()) {
101 fields[i] = "0";
102 } else if (i == 33 && fields[i] == "X") {
103 continue;
104 } else if (fields[i].find_first_not_of("0123456789.- ") !=
105 std::string::npos) {
106 AERROR <<
"HUACE ASCII message field error: " << fields[i]
107 << ", input str: " << input_str_;
108 return false;
109 }
110 }
111 return true;
112 };
113 if (fields[0] == protocol_.
GPCHC) {
115 AERROR <<
"GPCHC message format error: " << data_start;
116 return false;
117 }
118 if (!valid_fields()) {
119 return false;
120 }
121 PrepareMessageGPCHC(fields);
122 return true;
123 }
else if (fields[0] == protocol_.
GPCHCX) {
125 AERROR <<
"GPCHCX message format error:" << data_start;
126 return false;
127 }
128 if (!valid_fields()) {
129 return false;
130 }
131 PrepareMessageGPCHCX(fields);
132 return true;
133 }
134 return false;
135}
const uint8_t * data_end_