我正在接收包含UTF-16编码文本的缓冲区,如下所示:
uint8_t rx_data[length] = {0x04, 0x24, 0x04, 0x30, 0x04, 0x3C, 0x04, 0x38, 0x04, 0x3B,
0x04, 0x38, 0x04, 0x4F, 0x00, 0x0A, 0x04, 0x18, 0x04, 0x3C, 0x04, 0x4F,
0x00, 0x0A, 0x04, 0x1E, 0x04, 0x42, 0x04, 0x47, 0x04, 0x35, 0x04, 0x41,
0x04, 0x42, 0x04, 0x32, 0x04, 0x3E}
缓冲区包含三个文本字符串,它们在我的缓冲区中用“\n”或{0x00,0x0A}分隔。 如何按新行将文本拆分成字符串,这样我就会得到如下内容:
uint8_t str1[] = {0x04, 0x24, 0x04, 0x30, 0x04, 0x3C, 0x04, 0x38, 0x04, 0x3B,
0x04, 0x38, 0x04, 0x4F}
uint8_t str2[] = {0x04, 0x18, 0x04, 0x3C, 0x04, 0x4F}
uint8_t str3[] = {0x04, 0x18, 0x04, 0x3C, 0x04, 0x4F,
0x00, 0x0A, 0x04, 0x1E, 0x04, 0x42, 0x04, 0x47, 0x04, 0x35, 0x04, 0x41,
0x04, 0x42, 0x04, 0x32, 0x04, 0x3E}
我正在考虑将我的数组转换成标准库中的u16string或wstring,这样我就可以像这样处理转换后的字符串smth:
std::wstring s_rx_data = "string1/nstring2/nstring3";
std::wstring delimiter = "\n";
size_t pos = 0;
std::string token;
while ((pos = s_rx_data.find(delimiter)) != std::string::npos) {
token = s_rx_data.substr(0, pos);
std::cout << token << std::endl;
s_rx_data.erase(0, pos + delimiter.length());
}
std::cout << s_rx_data << std::endl;
然后将其转换回3个带字节的数组。 问题是,如何将我的缓冲区转换成C++字符串呢? 或者用更严格的方式来划分这个缓冲区可能更好? 例如,只需在循环中搜索分隔符,然后将分隔符之前的所有符号复制到新缓冲区。
附注。 所有这些都发生在STM32单片机上,所以我没有真正大的计算资源。 我正在通过以太网接收这个缓冲区,并且不得不将其分离出来,并通过只支持UTF-16BE的LCD屏幕上的UART打印。 我已经结合了C/C++项目,所以我可以使用C或C++方法。
std::wstring_convert<std::codecvt<char16_t,char,std::mbstate_t>,char16_t>convert;
std::u16string u16 = convert.from_bytes(rx_data);
这里有很多分裂的例子。