[英]How to get 16 or 32 bit iterator from 8 bit iterator in C++?
我寫了代碼,使用這個庫http://utfcpp.sourceforge.net ,它轉換 utf16to8:
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());
我的問題:如果我想轉換 utf32to8,我必須編寫所有這些代碼,但向量中的類型不同:
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 位整數(即字節)填充,這也有意義。
現在:
我想重構我的代碼並只使用一個向量而不是兩個不同類型的向量。
撇開這是一個弱要求(現在的類型有什么問題?)這可以通過從默認迭代器切換到指針來實現。 迭代器std::vector<T>::iterator
用於迭代std::vector<T>
周期。 你對T
的不同選擇都是整數並不重要; 它們是不同的類型。 但是指針可以用作迭代器(特別是當您使用像向量包含的連續數據塊時),並且將任意內存重新解釋為字節(僅限)是合法的。
作為獎勵,從文件中讀取會更容易,因為您返回到只讀取字節(這在某種程度上更有意義)。
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());
我希望我已經正確解釋了您的要求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.