C ++ получение короткого числа после строки в массиве байтов - PullRequest
0 голосов
/ 06 августа 2011

Привет, так что следуя этому Вопросу

Я снова застрял, и да, я попытался просмотреть Интернет и мой учебник.Я знаю, что публиковать еще один вопрос очень скоро, но я действительно озадачен этой проблемой.Так или иначе ...

Следующая часть задания просит меня найти возраст человека, этот возраст находится в следующем байте после имени.В основном, если имя было «Боб», это было бы

[L][u][k][e][\0][\0][1][5]

, где все имена с четным числом символов получают 2 нулевых символа, чтобы сделать его четным, а затем следующие два байта хранят целое число short.В данный момент я попытался посмотреть на длину строки, а затем добавить больше к длине, прежде чем поместить ее в смещение, но, похоже, она не работает

    if (name.length() % 2 != 0) {
        offset += (name.length());
        age = *((short*)foo+offset);
        cout << age << "\n";
    } else {
        offset += (name.length());
        age = *((short*)foo+offset);
        cout << age << "\n";
    }

1 Ответ

4 голосов
/ 06 августа 2011

Вам не хватает того, что C и C ++ умножают приращения указателя на размер объекта, на который указывает. Таким образом, *((short*)foo+offset) фактически добавляет размер смещения (коротких) байтов к foo.

Или, может быть, вы понимаете это, но не понимаете, что приведение имеет более высокий приоритет, чем сложение, (short *) foo + offset is ((short *) foo) + offset не (short *) (foo + offset ).

В любом случае, вы хотите *(short*)((char*)foo + offset). Если foo уже является char * или чем-то подобного, вы можете опустить приведение к char *.

...