gpt4 book ai didi

c++ - 如何从 C++ 中的 8 位迭代器获取 16 位或 32 位迭代器?

转载 作者:行者123 更新时间:2023-11-30 05:04:17 24 4
gpt4 key购买 nike

我编写了使用此库的代码 http://utfcpp.sourceforge.net ,它将 utf16 转换为 8:

    ifstream sourceFile("/home/myuser/utf16.txt", std::ifstream::binary);
vector<unsigned char> res;
std::vector<uint16_t> my_buffer;

my_buffer.resize(fileSize/2);
sourceFile.read((char*) my_buffer.data(), fileSize);

utf8::utf16to8(my_buffer.begin(),
my_buffer.end(),
back_inserter(res));
outFile.write((char*)&res[0], res.size());

我的问题:如果我想将 utf32 转换为 8,我必须编写所有这些代码,但 vector 中的类型不同:

    vector<unsigned char> res;
std::vector<uint32_t> my_buffer;

my_buffer.resize(fileSize/4);
sourceFile.read((char*) my_buffer.data(), fileSize);

utf8::utf32to8(my_buffer.begin(),
my_buffer.end(),
back_inserter(res));
outFile.write((char*)&res[0], res.size());

我正在使用 std::vector 和 std::vector 因为 lib uf8-cpp 需要 32 位和 16 位迭代器。有什么方法可以从 std::vector 获取这个迭代器,例如:

std::vector<char> myvector;
std::vector<uint16_t>::iterator u16bit_iterator = myvector.begin(); //this doesn't work now

最佳答案

让我们澄清手头的问题。

你有:

std::vector<uint32_t> in;
std::vector<uint8_t> out;

你想要in (UTF-32 格式的数据)转换为 out (UTF-8 格式的数据); in由 32 位整数填充,因为这是 utf8::utf32to8 所要求的(加上它是有道理的)和out由 8 位整数(即字节)填充,这也很有意义。

现在:

I want to refactore my code and use only one vector instead of two vectors with different types.

抛开这是一个弱要求(现在的类型有什么问题?)这可以通过从默认迭代器切换到指针来实现。迭代器 std::vector<T>::iterator用于遍历 std::vector<T> , 时期。您对 T 的不同选择并不重要都是整数;它们是不同的类型。但是指针可以用作迭代器(特别是当您使用连续的数据 block 时,例如 vector 包含的数据 block ),并且将任意内存重新解释为字节(仅)是合法的。

作为奖励,当您回到只读取字节时,从文件中读取会更容易(这在某种程度上确实更有意义)。

std::vector<uint8_t> in;
std::vector<uint8_t> out;

in.resize(fileSize);
sourceFile.read((char*)&in[0], fileSize);

// Make sure you have a whole number of 32-bit
// blocks, before we interpret them as bytes
assert((in.size() % 4) == 0);
utf8::utf32to8(
(uint32_t*)&in.front(),
(uint32_t*)&in.back(),
std::back_inserter(out)
);

outFile.write((char*)&out.front(), out.size());

希望我已经正确解释了您的要求。

关于c++ - 如何从 C++ 中的 8 位迭代器获取 16 位或 32 位迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48968141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com