Преобразование строки из четырех символов в длинную - PullRequest
3 голосов
/ 16 июня 2011

Я хочу преобразовать четырехсимвольную строку (то есть четыре символа) в длинную (т.е. преобразовать их в коды ASCII и затем поместить их в длинную).

Насколько я понимаю, это делается путем записи первого символа в первый байт длинной, второго в соседнюю ячейку памяти и так далее. Но я не знаю, как это сделать в C ++.

Может кто-нибудь указать мне правильное направление?

Заранее спасибо.

Ответы [ 3 ]

8 голосов
/ 16 июня 2011

Вот ваш набор из четырех символов:

const unsigned char buf[4] = { 'a', '0', '%', 'Q' };

Теперь мы собираем 32-разрядное целое число без знака:

const uint32_t n = (buf[0]) | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);

Здесь я предполагаю, что buf[0] является наименее значимым; если вы хотите пойти по другому пути, просто поменяйте местами индексы.

Давайте подтвердим:

printf("n = 0x%08X\n", n); // we get n = 0x51253061
                           //               Q % 0 a

Важное замечание: Убедитесь, что ваш первоначальный буфер байтов равен без знака , или добавьте явное приведение типа (unsigned int)(unsigned char)(buf[i]); в противном случае операции сдвига не определены четко.


Слово предупреждения: Я бы настоятельно предпочел это алгебраическое решение, чем возможно заманчивое const uint32_t n = *(uint32_t*)(buf), которое зависит от машинного порядка и заставит ваш компилятор злиться, если вы используете строгие предположения псевдонимов!


Как было указано ниже, вы можете попытаться быть еще более переносимым, не делая предположений о размере бита в байтах:

const unsigned very long int n = buf[0] |
              (buf[1] << (CHAR_BIT)     |
              (buf[2] << (CHAR_BIT * 2) |
              (buf[3] << (CHAR_BIT * 3)   ;

Не стесняйтесь писать свои обобщения по мере необходимости! (Удачи в определении подходящей строки формата printf ;-).)

1 голос
/ 16 июня 2011

Если на вашем компьютере длинные байты находятся в правильном порядке, тогда используйте memcpy, что-то вроде этого -

#include <cstdlib>
#include <iostream>

int main()
{
    char data[] = {'a', 'b', 'c', 'd'};
    long result;

    std::memcpy(&result, data, 4);
    std::cout << result << "\n";
}

Обратите внимание, что это будет зависеть от платформы для порядка байтов в длинном, который может илиможет быть не то, что вам нужно.И 4 жестко закодирован как размер в байтах для простоты.Вы, конечно, НЕ НАСТРАИВАЕТЕ жесткий код 4 в реальной программе.Все компиляторы, на которых я пробовал это, оптимизируют memcpy, когда оптимизация включена, поэтому, вероятно, она тоже будет эффективной.

РЕДАКТИРОВАТЬ: перейдите к смене и добавьте ответ кому-то еще, если он не отвечает вашим конкретным требованиям, какэто гораздо более портативный и безопасный!

0 голосов
/ 24 апреля 2013
#include <string>
#include <iostream>

std::string fourCharCode_toString ( int value )
{
    return std::string( reinterpret_cast<const char*>( &( value ) ), sizeof(int) );
}

int fourCharCode_toInt ( const std::string & value )
{
    return *( reinterpret_cast<const int*>( value.data() ) );
}

int main()
{
    int a = 'DROW';
    std::string str = fourCharCode_toString( a );
    int b = fourCharCode_toInt( str );

    std::cout << str << "\n";
}
...