powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Корректно преобразовать массив кодов символов в строку strong
15 сообщений из 15, страница 1 из 1
Корректно преобразовать массив кодов символов в строку strong
    #39447536
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте уважаемые Гуру!

Понадобилось обмениваться зашифрованными строками между php и С++
Нашел абсолютно рабочий алгоритм RC4 на php и решил переписать его на С++
На всех этапах (при трассировке кодов на PHP и С++) я получаю одинаковые данные во всех массивах.
Но на последнем этапе - преобразование массива с кодами символов зашифрованного текста в string ,
получаю результат, отличный от результата в PHP

Ошибка в строке преобразования кода символа в char

Подскажите пожалуйста в чем я "косячу"
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
$text = "Text";                             //Исходный текст
$arrText = array(101,20,205,100);          //Результат после XOR
for ($i=0; $i<count($arrText); $i++)
{
$temp= $temp.chr($arrText[$i]);          //Переводим массив символов в бинарную строку получаем значение "e&#65533;d"
}
$crypt = base64_encode($temp);
//получаем результат     ZRTNZA==


С++
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
string str = "";
std::vector<int> vText(101,20,205,100);   //Результат после XOR
for (int i = 0; i < (int)vText.size(); i++)
{
   str.push_back(char(vText[i]));    //Переводим массив байтов в бинарную строку  получаем значение "e\x14Нd" 
   //str.push_back(static_cast<char>(vText[i]));  //Пробовал и так. Получаем значение "e\x14Нd"
}
//После преобразования Base64 результат - "ZRTQnWQ="  (функция преобразования в Base64 работает корректно!)


Я пробовал преобразовать массив кодов в массив char , чтобы потом перевести его в string ,
но в массиве char - уже несоответствие.
Помогите пожалуйста разобраться

Заранее благодарен всем кто захочет помочь!
...
Рейтинг: 0 / 0
Корректно преобразовать массив кодов символов в строку strong
    #39447538
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arbit,

Используй unsigned char в коде C++, вместо char
...
Рейтинг: 0 / 0
Корректно преобразовать массив кодов символов в строку strong
    #39447542
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NekZ, спасибо

Строку
Код: plaintext
1.
str.push_back(char(vText[i]));


заменил на
Код: plaintext
1.
str.push_back(unsigned char(vText[i]));


но результат тотже... :((
...
Рейтинг: 0 / 0
Корректно преобразовать массив кодов символов в строку strong
    #39447718
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arbit,

ошибка где-то в других местах.
...
Рейтинг: 0 / 0
Корректно преобразовать массив кодов символов в строку strong
    #39447725
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запиши в файл строку в обоих случаях и сравни файлы.

Похоже косяк в PHP
Код: php
1.
2.
3.
$arrText = array(101,20,205,100);          //Результат после XOR
...
$temp= $temp.chr($arrText[$i]);          //Переводим массив символов в бинарную строку получаем значение "e&#65533;d"


65533 это 0xFFFD, а должно быть 0x14CD или 0xCD14
...
Рейтинг: 0 / 0
Корректно преобразовать массив кодов символов в строку strong
    #39447756
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arbit,
Проблема в том, что ваш код на каком-то этапе рассматривает строку string с кодами как набор уникодных символов. А там просто байты.
Вот эта "Н" из "e\x14Нd" это двухбайтовый символ состоящий из байтов D0 и 9D.
Тот С++ код что вы привели никак не может из 205 получить эти 2 байта. Значит проблема находится между этим кодом и функцией кодирования base64
...
Рейтинг: 0 / 0
Корректно преобразовать массив кодов символов в строку strong
    #39447823
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky, спасибо за участие!

Что касается кода на PHP? то он полностью рабочий, кодирует и декодирует правильно
И латиницу и кирилицу и иврит.

Значение, в PHP которое я привел в сообщении исказила страница форума при отправке сообщения.
На самом деле оно другое, но все равно не соответствует результату С++

По поводу юникода - я думал об этом. Там не только код 205 не обрабатывается функцией char или unsigned char
Код 20, например, не соответствует результату на PHP

Моих мозгов не хватает как это преобразование сделать корректным, чтобы скормить функции base 64
...
Рейтинг: 0 / 0
Корректно преобразовать массив кодов символов в строку strong
    #39447833
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скорее всего наверное надо попробовать преобразовать юникод в utf8? а потом уже пройтись unsigned char?
или я не в ту сторону думаю?
...
Рейтинг: 0 / 0
Корректно преобразовать массив кодов символов в строку strong
    #39448063
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или я чего-то крупное пропустил, или все пишущие в топике.

Набор байт (101,20,205,100) в ASCII виде это e\x14\xCDd, ну или "e\x14Нd" если у вас cp1251 (четвертый символ большая русская Н).

Открываем описание base64: https://en.wikipedia.org/wiki/Base64
Делаем по инструкции, конвертируем все четыре байта в двоичный код:
101 = 1100101b
20 = 10100b
205 = 11001101b
100 = 1100100b
То есть вся строка в двоичном виде: 01100101 00010100 11001101 01100100
Бьем ее на группы из шести бит: 011001 010001 010011 001101 011001 00
Добиваем последнюю неполную группу нулями: 011001 010001 010011 001101 011001 000000
Конвертируем эти шестибитовые группы в десятичный: 25 17 19 13 25 0
Заменяем цифры на буквы из таблицы: ZRTNZA
Так как по правилам base64 количество итоговых символов должно делиться на 4, добиваем результат знаками равенства: ZRTNZA==

Итого: Функция в php работает правильно. А когда Arbit в первом посте заявил:
Arbit//После преобразования Base64 результат - "ZRTQnWQ=" (функция преобразования в Base64 работает корректно!)Он явно соврал. Либо он отдает в корректно работающую функцию Base64 другую строку, либо эта функция работает неправильно.

Arbit, откуда ты взял эту функцию? Покажи как ты отдаешь ей строку на конвертацию.
...
Рейтинг: 0 / 0
Корректно преобразовать массив кодов символов в строку strong
    #39448168
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,простите новичка, но...

авторИли я чего-то крупное пропустил, или все пишущие в топике.
Вы действительно пропустили. Вы пропустили суть вопроса. а именно:

- Функции base64 работают корректно в обоих скриптах
- Исходный массив после XOR одинаков в обоих скриптах
- На вход base64 подаются разные строки, потому что разный результат при преобразовании массива
в строку символов в PHP и С++

И ближе всех, как мне кажется, был уважаемый Anatoly Moskovsky - строки в скриптах в разных кодировках.

Я очень надеюсь , что откликнется Уважаемый Гуру Изопропил.
...
Рейтинг: 0 / 0
Корректно преобразовать массив кодов символов в строку strong
    #39448328
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arbit- На вход base64 подаются разные строки, потому что разный результат при преобразовании массива
в строку символов в PHP и С++
Как вы передаете строку на вход base64 в С++ и как вы увидели, что строки разные?
...
Рейтинг: 0 / 0
Корректно преобразовать массив кодов символов в строку strong
    #39448337
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arbitстроки в скриптах в разных кодировках.
Вы где-то между опубликованным куском С++ кода и кодировкой в base64 зачем-то пытаетесь перевести строку из win1251 в utf8...
...
Рейтинг: 0 / 0
Корректно преобразовать массив кодов символов в строку strong
    #39448369
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не поленился найти реализацию base64 на С++
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
#include <string>
#include <iostream>
#include <vector>

std::string to_base64(const std::string input)
{
        static const char *BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

        const size_t len = input.length();
        std::string output;

        output.reserve((len + 2) / 3 * 4);

        unsigned remainder = 0;
        unsigned char leftover = 0;

        for (std::string::const_iterator i = input.begin(); i != input.end(); ++i) {
                unsigned char c = *i;
                switch (remainder) {
                case 0:
                        output += BASE64[c >> 2];
                        leftover = c << 6;
                        break;
                case 1:
                        output += BASE64[(leftover >> 2) + (c >> 4)];
                        leftover = c << 4;
                        break;
                case 2:
                        output += BASE64[(leftover >> 2) + (c >> 6)];
                        output += BASE64[c & 0x3F];
                        break;
                }
                remainder = (remainder + 1) % 3;
        }

        switch (remainder) {
        case 1:
                output += BASE64[leftover >> 2];
                output += '=';
                output += '=';
                break;
        case 2:
                output += BASE64[leftover >> 2];
                output += '=';
                break;
        }

        return output;
}

int main()
{

 std::string str = "";
 std::vector<int> vText = {101,20,205,100};   //Вашего синтаксиса мой компилятор не понимает...
 for (size_t i = 0; i < vText.size(); i++)
 {
   str.push_back(char(vText[i]));
 }

 std::cout << to_base64(str); // ZRTNZA==
}

...
Рейтинг: 0 / 0
Корректно преобразовать массив кодов символов в строку strong
    #39448774
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Barlone,
BarloneВы где-то между опубликованным куском С++ кода и кодировкой в base64 зачем-то пытаетесь перевести строку из win1251 в utf8...
Вы правы

Спасибо большое Anatoly Moskovsky и Barlone (жаль не нашел кнопку "поблагодарить")
Вопрос закрыт.
...
Рейтинг: 0 / 0
Корректно преобразовать массив кодов символов в строку strong
    #39452648
Common Lisp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArbitСкорее всего наверное надо попробовать преобразовать юникод в utf8? utf8 это уже не юникод?
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Корректно преобразовать массив кодов символов в строку strong
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]