работа с Base64, UTF8, байтами
От: paxerus  
Дата: 03.09.09 10:30
Оценка:
Добрый день

Суть вопроса такова что у меня есть строка русских смиволов в формате UTF8

мне необходимо зашифровать ее методом XOR и далее перегнать в base64
в принципи все понятно и как шифровать и даже функция перегона в base 64 есть


std::string  CRequest::EncodeMessage(std::wstring& wStr,std::string key)
{
    std::string cipher;
    int      i,k;

    for(i=0;i<wStr.length();i++)
    {   k=(i) % key.length();
        
    cipher.push_back(char((unsigned int)cipher.at(k)^(unsigned int)key.at(k)));
    
    }
        cipher=base64_encoded(cipher);
    return cipher;
}


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


__int16 a=(__int16)wStr.at(i) ;
BYTE ff=((char*)(&a))[0];
BYTE ff1=((char*)(&a))[1];



непонятн как потом при дешифрации собрать 2 байта которые кодируют один символ
Base64 UTF8 байты
Re: работа с Base64, UTF8, байтами
От: paxerus  
Дата: 03.09.09 10:37
Оценка:
еще дополню примером например у нас есть символ
с кодом в Аски
1056
0000010000100000
после того как разложим по байтам у нас будет
старший байт (100)
4
младший (100000)
32

нули перед ними улетучиваются посему не знаю как собрать их(, до этого с байтами толком не работал
Re: работа с Base64, UTF8, байтами
От: rising_edge  
Дата: 03.09.09 10:54
Оценка:
Здравствуйте, paxerus, Вы писали:

P>мне необходимо зашифровать ее методом XOR и далее перегнать в base64

P>в принципи все понятно и как шифровать и даже функция перегона в base 64 есть

А нельзя ли наоборот? Сначала закодировать в base64, а потом зашифровать?
Re: работа с Base64, UTF8, байтами
От: Alexander G Украина  
Дата: 03.09.09 11:10
Оценка:
Здравствуйте, paxerus, Вы писали:

P>
P>std::string  CRequest::EncodeMessage(std::wstring& wStr,std::string key)
P>{
P>    std::string cipher;
P>    int      i,k;

P>    for(i=0;i<wStr.length();i++)
P>    {   k=(i) % key.length();
        
P>    cipher.push_back(char((unsigned int)cipher.at(k)^(unsigned int)key.at(k)));
    
P>    }
P>        cipher=base64_encoded(cipher);
P>    return cipher;
P>}

P>


P>проблема в следующем

P>когда встречается символ в один байт, то по сути у нас есть старший байт нулевой и младший совпадает с кодом аски.
P>если больше одного байта (русские символы) то мне необходимо разбивать их , это я вроде разобрался как делать

А нельзя просто привести строку к const unsigned char и работать с байтами?
Русский военный корабль идёт ко дну!
Re[2]: работа с Base64, UTF8, байтами
От: paxerus  
Дата: 03.09.09 11:39
Оценка:
Здравствуйте, Alexander G, Вы писали:


AG>А нельзя просто привести строку к const unsigned char и работать с байтами?

хорошая идея спасибо сдалал так — пол дела сделано

std::vector<unsigned char> mmm;
mmm.push_back((unsigned char)wStr.c_str());


теперь как обратно сделать подскажите плз
у меня после декодировки base64 есть массив байт как теперь собрать строку?
std::vector<BYTE> bt;
Re[2]: работа с Base64, UTF8, байтами
От: paxerus  
Дата: 03.09.09 11:41
Оценка:
Здравствуйте, rising_edge, Вы писали:

_>Здравствуйте, paxerus, Вы писали:


P>>мне необходимо зашифровать ее методом XOR и далее перегнать в base64

P>>в принципи все понятно и как шифровать и даже функция перегона в base 64 есть

_>А нельзя ли наоборот? Сначала закодировать в base64, а потом зашифровать?


нельзя- во первых,во вторых разницы по моему никакой не будет
Re[3]: работа с Base64, UTF8, байтами
От: Alexander G Украина  
Дата: 03.09.09 11:51
Оценка:
Здравствуйте, paxerus, Вы писали:


P>теперь как обратно сделать подскажите плз

P>у меня после декодировки base64 есть массив байт как теперь собрать строку?
P>std::vector<BYTE> bt;

std::wstring str;
if (!bt.empty())
{
  wchar_t * begin = reinterpret_cast<wchar_t*>(&bt[0]);
  str.assign(begin, begin + bt.size / sizeof(wchar_t));
}
Русский военный корабль идёт ко дну!
Re: работа с Base64, UTF8, байтами
От: Mr.Cat  
Дата: 03.09.09 13:23
Оценка:
Здравствуйте, paxerus, Вы писали:
P>std::wstring
Ты уверен, что у тебя именно utf8? Просто utf8 в wstring не кладут.
Re[2]: работа с Base64, UTF8, байтами
От: paxerus  
Дата: 03.09.09 14:15
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>Здравствуйте, paxerus, Вы писали:

P>>std::wstring
MC>Ты уверен, что у тебя именно utf8? Просто utf8 в wstring не кладут.

да utf8
вот пример
Группа 1
тоже самое utf8
Группа 1
Re: работа с Base64, UTF8, байтами
От: Pzz Россия https://github.com/alexpevzner
Дата: 03.09.09 14:22
Оценка:
Здравствуйте, paxerus, Вы писали:

P>проблема в следующем

P>когда встречается символ в один байт, то по сути у нас есть старший байт нулевой и младший совпадает с кодом аски.
P>если больше одного байта (русские символы) то мне необходимо разбивать их , это я вроде разобрался как делать

Ваще говоря, utf-8 использует разное количество байтов для кодирования разных символов. При этом первая половина ASCII-таблицы передается как есть, по одному байту на символ. Utf-8 никогда не использует нулевой байт в качестве префикса.

P>непонятн как потом при дешифрации собрать 2 байта которые кодируют один символ


http://en.wikipedia.org/wiki/UTF-8

Читаете побайтово. Глядя на первый байт, вы можете узнать, сколько всего байтов в символе. Дальше вычитываете их все и собираете символ.

Utf-8 нельзя "собирать" с середины (с произвольного места), если вы не знаете точно, что произвольное место попадает на начало символа. А не в середину его.
Re[4]: работа с Base64, UTF8, байтами
От: paxerus  
Дата: 03.09.09 14:24
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Здравствуйте, paxerus, Вы писали:



P>>теперь как обратно сделать подскажите плз

P>>у меня после декодировки base64 есть массив байт как теперь собрать строку?
P>>std::vector<BYTE> bt;

AG>
AG>std::wstring str;
AG>if (!bt.empty())
AG>{
AG>  wchar_t * begin = reinterpret_cast<wchar_t*>(&bt[0]);
AG>  str.assign(begin, begin + bt.size / sizeof(wchar_t));
AG>}
AG>


не прокатывает
массив str после выполнения
[0] 24875 L'愫' wchar_t
[1] 29521 L'獑' wchar_t
[2] 27479 L'歗' wchar_t
[3] 17518 L'䑮' wchar_t
[4] 25937 L'救' wchar_t
[5] 30577 L'睱' wchar_t
[6] 27478 L'歖' wchar_t
[7] 24609 L'怡' wchar_t
[8] 25936 L'敐' wchar_t
[9] 30500 L'眤' wchar_t
[10] 27479 L'歗' wchar_t
[11] 24613 L'急' wchar_t
[12] 25936 L'敐' wchar_t
[13] 29635 L'珃' wchar_t
[14] 28503 L'潗' wchar_t
[15] 25667 L'摃' wchar_t
[16] 24914 L'慒' wchar_t
[17] 29535 L'獟' wchar_t
[18] 28501 L'潕' wchar_t
[19] 24658 L'恒' wchar_t
[20] 16748 L'䅬' wchar_t
[21] 30546 L'睒' wchar_t
[22] 27509 L'歵' wchar_t
[23] 24659 L'恓' wchar_t
[24] 25891 L'攣' wchar_t
[25] 30547 L'睓' wchar_t
[26] 0 wchar_t
[27] 0 wchar_t
[28] 0 wchar_t
[29] 0 wchar_t
[30] 0 wchar_t
[31] 0 wchar_t
[32] 0 wchar_t
[33] 0 wchar_t
[34] 0 wchar_t
[35] 0 wchar_t
Re[5]: работа с Base64, UTF8, байтами
От: Alexander G Украина  
Дата: 03.09.09 14:33
Оценка:
Здравствуйте, paxerus, Вы писали:

P>
P>std::vector<unsigned char> mmm;
P>mmm.push_back((unsigned char)wStr.c_str());
P>


Ну да, так не получится

size_t size = wStr.size() * sizeof(wchar_t)
unsigned char const* c = (unsigned char const*)wStr.c_str();
std::vector<unsigned char> mmm(c, c + size);
Русский военный корабль идёт ко дну!
Re[2]: работа с Base64, UTF8, байтами
От: paxerus  
Дата: 03.09.09 14:35
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, paxerus, Вы писали:


P>>проблема в следующем

P>>когда встречается символ в один байт, то по сути у нас есть старший байт нулевой и младший совпадает с кодом аски.
P>>если больше одного байта (русские символы) то мне необходимо разбивать их , это я вроде разобрался как делать

Pzz>Ваще говоря, utf-8 использует разное количество байтов для кодирования разных символов. При этом первая половина ASCII-таблицы передается как есть, по одному байту на символ. Utf-8 никогда не использует нулевой байт в качестве префикса.


P>>непонятн как потом при дешифрации собрать 2 байта которые кодируют один символ


Pzz>http://en.wikipedia.org/wiki/UTF-8


Pzz>Читаете побайтово. Глядя на первый байт, вы можете узнать, сколько всего байтов в символе. Дальше вычитываете их все и собираете символ.


Pzz>Utf-8 нельзя "собирать" с середины (с произвольного места), если вы не знаете точно, что произвольное место попадает на начало символа. А не в середину его.


Не могли бы вы разъяснить на примере какого либо одного русского ASCII символа?
Re[6]: работа с Base64, UTF8, байтами
От: paxerus  
Дата: 03.09.09 14:36
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Здравствуйте, paxerus, Вы писали:


P>>
P>>std::vector<unsigned char> mmm;
P>>mmm.push_back((unsigned char)wStr.c_str());
P>>


AG>Ну да, так не получится


AG>
AG>size_t size = wStr.size() * sizeof(wchar_t)
AG>unsigned char const* c = (unsigned char const*)wStr.c_str();
AG>std::vector<unsigned char> mmm(c, c + size);
AG>


это я уже заметил и переделал ранее
Re[7]: работа с Base64, UTF8, байтами
От: paxerus  
Дата: 03.09.09 14:37
Оценка:
P>это я уже заметил и переделал ранее
переделал только по своему сейчас попробую ваш вариант
Re[7]: работа с Base64, UTF8, байтами
От: Alexander G Украина  
Дата: 03.09.09 14:40
Оценка:
Здравствуйте, paxerus, Вы писали:


P>это я уже заметил и переделал ранее


Тогда в другом месте ошибка

int main()
{
  std::wstring wStr(L"Привет");
  size_t size = wStr.size() * sizeof(wchar_t);
  unsigned char const* c = (unsigned char const*)wStr.c_str();
  std::vector<unsigned char> mmm(c, c + size);
  std::wstring str;
  if (!mmm.empty())
  {
    wchar_t * begin = reinterpret_cast<wchar_t*>(&mmm[0]);
    str.assign(begin, begin + mmm.size() / sizeof(wchar_t));
  }
  return 0;
}
Русский военный корабль идёт ко дну!
Re[3]: работа с Base64, UTF8, байтами
От: Pzz Россия https://github.com/alexpevzner
Дата: 03.09.09 14:52
Оценка:
Здравствуйте, paxerus, Вы писали:

P>Не могли бы вы разъяснить на примере какого либо одного русского ASCII символа?


Русский символ 'А' кодируется как 0xd0 0x90

Первый байт выглядит в двоичном виде как 11010000. Второй как 10010000

Смотрим на табличку в википедии за расшифровкой. Нам подходит вторая строка, т.к. первый байт начинается с 110:

110yyyxx 10xxxxxx

yyy = 100, xxx = 00010000

Переводим назад в hex: yyy = 0x04, xxx = 0x10

Складываем yyy << 8 + xxx, получаем 0x0410, что соответствует UNICODE-кодировке буквы 'А'.
Re[8]: работа с Base64, UTF8, байтами
От: paxerus  
Дата: 03.09.09 15:08
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Здравствуйте, paxerus, Вы писали:



P>>это я уже заметил и переделал ранее


AG>Тогда в другом месте ошибка


AG>
AG>int main()
AG>{
AG>  std::wstring wStr(L"Привет");
AG>  size_t size = wStr.size() * sizeof(wchar_t);
AG>  unsigned char const* c = (unsigned char const*)wStr.c_str();
AG>  std::vector<unsigned char> mmm(c, c + size);
AG>  std::wstring str;
AG>  if (!mmm.empty())
AG>  {
AG>    wchar_t * begin = reinterpret_cast<wchar_t*>(&mmm[0]);
AG>    str.assign(begin, begin + mmm.size() / sizeof(wchar_t));
AG>  }
AG>  return 0;
AG>}
AG>

у себя ошибку вроде отыскал не доконца пока еще ,где то строку видимо обрезает но это уже ерунда,я найду где , главное что хотяб часть строки уже работает
ВСЕМ огромное спасибо за помощь,как отлажу приложу функцию
Re[4]: работа с Base64, UTF8, байтами
От: paxerus  
Дата: 03.09.09 15:12
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, paxerus, Вы писали:


P>>Не могли бы вы разъяснить на примере какого либо одного русского ASCII символа?


Pzz>Русский символ 'А' кодируется как 0xd0 0x90


Pzz>Первый байт выглядит в двоичном виде как 11010000. Второй как 10010000


Pzz>Смотрим на табличку в википедии за расшифровкой. Нам подходит вторая строка, т.к. первый байт начинается с 110:


Pzz>110yyyxx 10xxxxxx


Pzz>yyy = 100, xxx = 00010000


Pzz>Переводим назад в hex: yyy = 0x04, xxx = 0x10


Pzz>Складываем yyy << 8 + xxx, получаем 0x0410, что соответствует UNICODE-кодировке буквы 'А'.


спасибо за разъяснения постораюсь во всем до конца разбраться чтоб дальше было легче
Re[5]: работа с Base64, UTF8, байтами
От: paxerus  
Дата: 03.09.09 15:21
Оценка:
вот вроде сейчас ничего не обрезается прилагаю код

//+------------------------------------------------------------------+
//|       шифровка сообщения                                         |
//+------------------------------------------------------------------+
std::string  CRequest::EncodeMessage(std::wstring& wStr,std::string key)
{
    std::string cipher;
    int      i,k;

    size_t size = wStr.size() * sizeof(wchar_t);
    unsigned char const* c = (unsigned char const*)wStr.c_str();
    std::vector<unsigned char> mmm(c, c + size);

    for(i=0;i<mmm.size();i++)
    {   k=(i) % key.length();
        cipher.push_back(char(mmm[i]^(unsigned char)key.at(k)));
    }
        cipher=base64_encoded(cipher);
    return cipher;
}
//+------------------------------------------------------------------+
//|       расшифровка сообщения                                      |
//+------------------------------------------------------------------+
std::wstring  CRequest:: DecodeMessage(std::string& chipher,std::string key)
{

    std::wstring wstr;
    std::vector< byte> bt;
    std::vector<unsigned char> bt1;
    int      i,k;
    bt=base64_decoded(chipher);

    unsigned int b=0;
    
    for(i=0;i<bt.size();i++)
    {    k=(i) % key.length();
        bt1.push_back(((unsigned char)(bt.at(i)) ^  (unsigned char)(key.at(k))));
    }    
    if (!bt1.empty())
    {
      wchar_t * begin = reinterpret_cast<wchar_t*>(&bt1[0]);
      wstr.assign(begin, begin + bt1.size() / sizeof(wchar_t));
    }
    return wstr;
}
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.