Увеличение отдельных символов в строке - PullRequest
0 голосов
/ 20 мая 2011

Я не знаю, есть ли у меня правильный наклон для этого, поэтому, пожалуйста, поправьте меня, если я ошибаюсь, и я изменю свой титул.

У меня есть строка, для этого примера я буду использовать:

"8ce4b16b"

Я хотел бы сдвинуть биты (я думаю) вдоль 1, чтобы строка была:

"9df5c27c"

Есть идеи?

EDIT:

Просто чтобы вы знали, эти строки шестнадцатеричные. Так что оно никогда не достигнет z. Все, что я хочу сделать, это добавить число к числам и продвинуться на один шаг по алфавиту, чтобы a-> b, f-> g ect ect

Если число равно 9, будет условие, чтобы оно оставалось равным 9.

Выход НЕ ДОЛЖЕН быть шестнадцатеричным.

Также строка является только примером. Это часть шифрования MD5.

Ответы [ 4 ]

6 голосов
/ 20 мая 2011

Преобразовать string?Это звучит как работа для std::transform():

#include <cassert>
#include <string>

char increment(char c)
{
    if ('9' == c)
    {
        return '9';
    }
    return ++c;
}

std::string increment_string(const std::string& in)
{
    std::string out;
    std::transform(in.begin(), in.end(), std::back_inserter(out), increment);
    return out;
}

int main()
{
    assert(increment_string("8ce4b16b") == "9df5c27c");
    assert(increment_string("ffffffff") == "gggggggg");
    assert(increment_string("89898989") == "99999999"); // N.B: this is one of 2^8 strings that will return "99999999"
    assert(increment_string("99999999") == "99999999"); // This is one more. Mapping backwards is going to be tricky!
    return 1;
}

Любые ограничения, которые вы хотите наложить на персонажей, могут быть реализованы в функции increment(), как показано.

Если, с другой стороны, вы хотите трактовать строку как шестнадцатеричное число и добавить к ней 0x11111111:

#include <sstream>
#include <cassert>

int main()
{
    std::istringstream iss("8ce4b16b");
    long int i;
    iss >> std::hex >> i;
    i += 0x11111111;
    std::ostringstream oss;
    oss << std::hex << i;
    assert(oss.str() == "9df5c27c");
    return 1;
}

Никакие биты не были сдвинуты при построении этого string.

2 голосов
/ 20 мая 2011

Похоже, вы просто добавили 0x11111111 к целому числу.Но можете ли вы точно указать, что ваш ввод?И каков будет результат, если вы добавите один к «f» или «9»?

1 голос
/ 20 мая 2011

Это не смещение битов ... смещение бита умножает значение слова на 2. Вы просто увеличиваете каждое шестнадцатеричное значение на 1, и это можно сделать, добавив 0x11111111 к своему мечу.

Например, если вы взяли свое значение 0x8ce4b16b (это будет относиться к значениям, которые вы напечатали выше, как если бы они были 4-байтовым двойным словом в шестнадцатеричном формате), сместив его на один бит, вы получите0x19C962D6.

Но если вы просто хотите увеличить каждый кусочек вашего меча (каждое отдельное значение в шестнадцатеричном числе представляет собой 4-битный или полубайт), вам нужно будет добавить смещение0x1 к каждому клеву.Также нет значения G в шестнадцатеричном слове ... у вас есть значения 0->9, а затем A->F, где F представляет значение 15 из base-10. Наконец, когда вы добавляете 0x1 до 0xF, вы собираетесь перейти к 0x0.

0 голосов
/ 20 мая 2011

Вы имеете в виду, что хотите увеличить каждый символ в строке? Вы можете сделать это, перебирая массив и добавляя по одному к каждому символу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...