用定界符分开包含UTF-16的BE文本的uint8_t数组。

问题描述 投票:0回答:1

我正在接收包含UTF-16 BE编码文本的缓冲区,就像这样。

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 这样我就可以用转换后的字符串做这样的事情了:

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;

问题是, 我怎样才能把我的缓冲区转换为c++字符串? 或者使用更严格的方式来划分缓冲区可能会更好?比如在循环中搜索定界符,然后将定界符前的所有符号复制到新的缓冲区。

P.S. 所有这些都发生在STM32单片机上,所以我没有很大的计算资源。我是通过以太网接收这个缓冲区的,我必须把它分开,然后通过UART打印到只支持UTF-16BE的LCD屏幕上。我已经结合了CC++项目,所以我可以使用C或C++方法。

c++ string utf-16 uint8t
1个回答
1
投票
std::wstring_convert<std::codecvt<char16_t,char,std::mbstate_t>,char16_t>convert;
std::u16string u16 = convert.from_bytes(rx_data);

此处 是很多拆分的例子。

© www.soinside.com 2019 - 2024. All rights reserved.