簡體   English   中英

如何迭代128位塊中的字符串?

[英]How can I iterate over a string in 128-bit chunks?

我有一個函數可以處理來自任意長度字符串的128位數據塊。 如果字符串不能均勻地分成128位的塊,則會相應地填充它。

目的是轉換輸入函數的字符串中的數據。

我最初想過循環字符串這樣:

//This might have stupid errors.  Hopefully it stillg gets the point across.
for (int i = 0; i < strn.size(); i += 16)
{
    string block = strn.substr(i, i + 15);
    strn.replace(i, i + 15, block);
}

我想這會奏效,但我認為必須有更優雅的方式來做到這一點。 想到的一個想法是將strn封裝在一個類中並實現我自己的迭代器,該迭代器可以以128位塊的形式讀取其內容。 這很有吸引力,因為構造函數可以處理填充,我當前使用的一些函數可以是私有的,從而避免了潛在的誤用。 這看起來像是一種富有成效的方法嗎? 如果是這樣,那么如何實現自己的迭代器呢? 我非常歡迎詳細的解釋,因為我對C ++缺乏經驗。

還有其他的,或許更好的方法嗎?

謝謝!

有很多方法。 其中一個更簡單明了的就是:你可以創建自己的類型,大小只有128位; 簡單的struct將完成這項工作。

typedef struct
{
    char buf[16];
} _128bit;

並用它來迭代你的字符串。 將字符串的開頭強制轉換為此結構類型: _128bit* start = (_128bit*)buffer; 並使用積分指針算法開始迭代。 start時的所有操作都將按其大小進行操作。 例如, start++將向前移動128位; start--將移回128位。 一旦您處於所需位置,將其重鑄為所需類型並執行操作。

我可能會用迭代器而不是索引來做這個,仍然使用你自己的for循環:

const int NUM_BITS_IN_CHUNK = 128;
const int CHUNK_SIZE = NUM_BITS_IN_CHUNK / CHAR_BIT;

for(std::string::const_iterator iter = str.begin(); iter < str.end(); iter += CHUNK_SIZE)
{
    your_func(iter, iter + CHUNK_SIZE);
}

boost :: iterator_adaptor代碼看起來像這樣。 請注意,為了簡單起見,我只獲得每個塊四個字節而不是16個字節:

#include <iostream>
#include <string>

#include <boost/iterator_adaptors.hpp>

struct string_chunk_iterator : public boost::iterator_adaptor<string_chunk_iterator, std::string::const_iterator>
{
    string_chunk_iterator(const std::string::const_iterator& base) : iterator_adaptor(base) { }

private:
    friend class boost::iterator_core_access;
    void increment() { this->base_reference() = this->base() + 4; }
    void advance(typename iterator_adaptor::difference_type n)
    {
        this->base_reference() = this->base() + (4 * n);
    }
};

int main()
{
    const std::string tester(20, 'A');

    string_chunk_iterator iter(tester.begin());
    string_chunk_iterator str_end(tester.end());

    for(; iter != str_end; ++iter)
    {
        std::string chunk(&*iter, &*(iter + 1));

        std::cout << chunk << std::endl;
    }

    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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