6

我有一个函数可以对任意长度字符串的 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++ 非常缺乏经验。

还有其他的,或许更好的方法吗?

谢谢!

4

2 回答 2

3

有很多方法。一种更简单直接的方法是:您可以创建自己的类型,大小正好为 128 位;简单struct就可以了。

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

并用它来迭代你的字符串。将字符串的开头转换为此结构类型:_128bit* start = (_128bit*)buffer;并使用整数指针算法开始对其进行迭代。上的所有操作start都将根据其大小进行操作。例如,start++将向前移动 128 位;start--将向后移动 128 位。到达所需位置后,将其重铸为所需类型并执行操作。

于 2012-11-06T17:02:33.473 回答
1

我可能会使用迭代器而不是索引来执行此操作,仍然使用您自己的 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;
}
于 2012-11-06T21:50:01.183 回答