簡體   English   中英

如何從 C++ 中的 8 位迭代器獲取 16 位或 32 位迭代器?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM