создание буфера/пакета в С++

Я пытаюсь что-то проверить, и мне нужно предположить, что ввод исходит от клиента, использующего TCP, и что данные представляют собой буфер или, возможно, массив байтов.

Итак, это моя попытка:

unsigned char buf[] = { 99, 249, 117, 130, 110, 227, 171, 204, 30, 201, 225, 130, 203, 206, 74, 88, 94, 12, 223, 172, 60, 12 , 173, 26, 145, 163, 112, 124, 99, 239, 188, 98, 103, 85, 163, 135, 125, 140, 186, 220, 207, 35, 185, 14, 22, 58, 36 , 239, 124, 107, 29, 27, 44, 246, 165};

Предположим, что это от клиента. Я хотел бы проверить, чтобы обработать его:

xor256.Decrypt(buf, result, sizeof(buf));

Но Decrypt это:

void XOR256::Decrypt(char const* in, char* result, size_t n)

Итак, как мне это исправить?

Проблемы:

  • Невозможно инициализировать переменную типа const char * с lvalue типа unsigned char[55]

  • Я смущен этим. Я хочу получить результат, но эта функция ничего не возвращает. Но он указывает данные на result. Итак, как мне получить данные?

  • я новичок в С++


int main(int argc, const char * argv[])
{
    CXOR256Stream xor256;

    char *nkey = new char[256];

    int a = 111;
    int b = 222;

    memset(nkey, 0x00, 256);
    sprintf((char*)nkey, "%.5d_XXX%.5d_XXX_%.5d", (a+10), (b+10), (a+b));


    unsigned char s[] = { 99, 249, 117, 130, 110, 227, 171, 204, 30, 201, 225, 130, 203, 206, 74, 88, 94, 12, 223, 172, 60, 12, 173, 26, 145, 163, 112, 124, 99, 239, 188, 98, 103, 85, 163, 135, 125, 140, 186, 220, 207, 35, 185, 14, 22, 58, 36, 239, 124, 107, 29, 27, 44, 246, 165 };

    const char* buf = s; // error here
    char result[50];

    xor256.Initialize(nkey, 256, 2);
    xor256.Decrypt(buf, result, sizeof(buf));

    // no error here but I'm confused on getting the data from decrypt so is this right?
    cout << result << endl;

    return 0;
}

person majidarif    schedule 22.06.2014    source источник
comment
Можете ли вы показать всю свою тестовую функцию?   -  person Addison    schedule 22.06.2014
comment
@Addison, см. обновленный вопрос. благодарю вас.   -  person majidarif    schedule 22.06.2014
comment
В какой строке вы получаете ошибку?   -  person Addison    schedule 22.06.2014
comment
@Addison см. обновленный источник по вопросу. благодарю вас.   -  person majidarif    schedule 22.06.2014
comment
Попробуйте сделать массив s[] просто массивом символов, а не беззнаковым.   -  person Addison    schedule 22.06.2014
comment
@Addison да, но это приведет к ошибке: constant expression evaluates to 249 which cannot be narrowed to type char   -  person majidarif    schedule 22.06.2014
comment
@ Аддисон, который не взлетит. char не имеет стандартного представления для значений выше 127 с учетом обычных октетов.   -  person WhozCraig    schedule 22.06.2014
comment
Я понимаю. Тогда я не думаю, что знаю достаточно С++, чтобы ответить на этот вопрос.   -  person Addison    schedule 22.06.2014
comment
Странно, я не получаю эти ошибки в C, только предупреждения. Не о чем беспокоиться, если это для сетевого ввода-вывода. Байты остаются байтами независимо от того, как вы их интерпретируете. char и unsigned char имеют одинаковый размер. Если вы преобразуете 249 в char, оно превысит отрицательное число, но если вы преобразуете его в char, вы получите исходное значение.   -  person sudo    schedule 22.06.2014
comment
@9000 может быть, но я не могу его скомпилировать, так как получаю ошибку constant expression...cannot be narrowed to type char   -  person majidarif    schedule 22.06.2014


Ответы (2)


Честно говоря, это проблема, требующая лучшего изучения языка. Я не хочу, чтобы это звучало резко, поэтому, пожалуйста, не воспринимайте это как таковое. Обучение на примерах, безусловно, понятно, и многие, в том числе и я, хорошо учатся сами по себе. Я могу привести один (пример), но вы не можете воспринимать это как «ну, эта проблема решена», потому что настоящая проблема заключается в изучении языка (и поверьте мне, язык потрясающий , так что это стоит боли).

Во всяком случае, на ваш код. Предполагая, что вы не хотите последующей утечки памяти (динамическое выделение не требуется), самый простой ответ таков:

int main(int argc, const char * argv[])
{
    CXOR256Stream xor256;

    char nkey[256] = {0};

    int a = 111;
    int b = 222;
    sprintf(nkey, "%.5d_XXX%.5d_XXX_%.5d", (a+10), (b+10), (a+b));

    unsigned char s[] = 
    { 
      99, 249, 117, 130, 110, 227, 171, 204, 30, 201, 225, 
      130, 203, 206, 74, 88, 94, 12, 223, 172, 60, 12, 173, 
      26, 145, 163, 112, 124, 99, 239, 188, 98, 103, 85, 163, 
      135, 125, 140, 186, 220, 207, 35, 185, 14, 22, 58, 36, 
      239, 124, 107, 29, 27, 44, 246, 165 
    };


    char result[sizeof(s)] = {0};

    xor256.Initialize(nkey, sizeof(nkey), 2);
    xor256.Decrypt(reinterpret_cast<char const*>(s), result, sizeof(s));
    cout << result << endl;

    return 0;
}

Отметить:

  • Динамический буфер не нужен.
  • sizeof(buf) совершенно неверно для параметра размера вашего расшифровки. Это размер указателя, вам нужно количество байтов в зашифрованном тексте.
  • Суть вашего вопроса в том, что API ожидает, что адрес будет постоянным char данными, вы передаете адрес unsigned char данным. в этой ситуации возможен reinterpret_cast<>. Это не то, что вы легко бросаете в C++, так что не привыкайте к этому.

Тем не менее, если я понимаю код, который вы пытаетесь вызвать, ваши размеры буфера могут нуждаться в доработке. пакет алгоритма XOR256Stream, который, как я думаю, вы используете, должен документировать точные необходимые размеры буфера. Я подозреваю, что буфера результатов длиной 50 будет недостаточно, но это не корень вашего вопроса. Это должно, по крайней мере, заставить вас начать. Удачи.

person WhozCraig    schedule 22.06.2014
comment
Лучший и более полный ответ, чем мой, но я должен указать: char result[sizeof(s)] должно быть char result[sizeof(s)/sizeof(char)]. - person sudo; 22.06.2014
comment
@WhozCraig, спасибо, но я искренне думаю, что C++ действительно сложно выучить. Я не знаю, с чего начать. Хотя я хорошо знаком с интерпретируемыми языками, такими как php, python, ruby ​​или javascript. - person majidarif; 22.06.2014
comment
@9000 sizeof(char) определяется языковым стандартом как всегда единица, даже если char состоит из нескольких октетов. Я знаю, это звучит странно, но это правда. Дивизия не нужна. - person WhozCraig; 22.06.2014
comment
@WhozCraig, похоже, вы очень хорошо знакомы с c, есть ли что-нибудь, с чего можно начать? - person majidarif; 22.06.2014
comment
@WhozCraig Да, ты прав. Мне говорили иначе, но это действительно всегда 1. - person sudo; 22.06.2014
comment
@majidarif Начните с некоторых наиболее популярных текстов для начинающих здесь. Я настоятельно рекомендую вам написать тонну коротких примеров кода, пока вы учитесь укреплять хорошие привычки. Проводите час или около того в день, просто читая cppreference.com. Изучите стандартную библиотеку, а также язык. это окупится с огромной выгодой в долгосрочной перспективе. - person WhozCraig; 22.06.2014
comment
@9000 не беспокойтесь. Если вы действительно хотите получить буфер с количеством октетов (по каким-то запутанным причинам), вы можете сделать это, умножив на (CHAR_BIT/8), но у меня, честно говоря, никогда не было причин для этого. Нередко можно увидеть, как это делается, как вы показали, и любой отдаленно приличный компилятор полностью отбросит деление, так что никакого вреда, кроме дополнительных нажатий клавиш. =П - person WhozCraig; 22.06.2014
comment
@WhozCraig Да, мне все равно нравится это делать, просто чтобы это соответствовало частям, где я делаю что-то вроде sizeof(foo)/sizeof(int). Я до сих пор думал, что это тоже необходимо :) - person sudo; 22.06.2014
comment
@9000 это, вероятно, лучшая причина, по которой я слышал об этом, независимо от ее бессмысленных эффектов. Тоже хорошо представлен. Если вы привыкли к этой привычке с массивами, я обычно использую sizeof(arr)/sizeof(*arr), что исключает вопрос о типе и возвращает его в decl, но практика остается в силе. ГДж. - person WhozCraig; 22.06.2014

Вам просто нужно приведение типов.

const char* buf = (const char*) s;

Вы получите отрицательные числа для тех, кто выше 127. Преобразование между char и unsigned char не приводит к потерям, поэтому это нормально, если вы правильно обрабатываете его в другом месте. Редактировать: Тем не менее, вы должны быть осторожны с этим, потому что преобразование может быть непредсказуемым, если вы не собираетесь char, а затем сразу обратно.

person sudo    schedule 22.06.2014