Поиск:

Ответ в темуСоздание новой темы Создание опроса
> base64: кодирование и декодирование 
V
    Опции темы
MoLeX
Дата 26.11.2008, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 1
Всего: 140



Привет всем...

Не получается декодировать данные из base64.
т.е. есть строка закодированая
Код

z/Di5eTlIOLg7CA9KQ==
]

ее надо декодировать, а как не знаю =(

В РНР для этого есть две ф-ции base64_decode() и base64_encode(). в С++ нашел тока Base64Encode(), предварительно подключив 
Код

#include "IdCoder3To4.hpp"




--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Alca
Дата 26.11.2008, 16:57 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Код

//---------------------------------------------------------------------------
char сHexToChar(char *pszStr) {
    //-------------------------------------
    //CHECK
    if (NULL == pszStr || 0 == strlen(pszStr)) {
        return 0;
    }

    //-------------------------------------
    //
    char ch;

    if (pszStr[0] >= 'A') {
        ch = ((pszStr[0] & 0xdf) - 'A') + 10;
    } else {
        ch = pszStr[0] - '0';
    }

    ch <<= 4;

    if (pszStr[1] >= 'A') {
        ch += ((pszStr[1] & 0xdf) - 'A') + 10;
    } else {
        ch += pszStr[1] - '0';
    }

    return ch;
}
//%FF%E4%F0%E5%ED%E0%20%62%75%67%73 -> "ядрена bugs"
std::string sBase64Decode(const std::string &сsStr) {
    std::string sRes("");
    sRes.assign(сsStr);
  
    unsigned int uiSrc  = 0;
    unsigned int uiDest = 0;
    char         ch     = 0;
    for (uiSrc = 0, uiDest = 0; sRes[uiSrc]; uiSrc ++, uiDest ++)   {
        ch = sRes[uiSrc];
        ch = (ch == '+') ? ' ' : ch;
        sRes[uiDest] = ch;
        
        if (ch == '%')    {
            sRes[uiDest] = сHexToChar(&sRes[uiSrc + 1]);
            uiSrc += 2;
        }
    }
    sRes[uiDest] = '\0';        //отрезаем все что идет после '\0'
    
    return std::string(sRes.c_str());    //возвращаем Си-шную строку, все до нуля    
}
//---------------------------------------------------------------------------

Компилил VS 2005.

Это сообщение отредактировал(а) Alca - 26.11.2008, 17:09

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  Base64.zip 2,75 Kb


--------------------
PM WWW ICQ Skype Jabber   Вверх
kefir01
Дата 26.11.2008, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



http://forum.vingrad.ru/forum/topic-234161...ead-encode.html
тут все есть 

проще говоря
Код

#include <encddecd.hpp>


Код

AnsiString text = "text";
AnsiString encoded = EncodeString(text);
AnsiString decoded = DecodeString(encoded);


Это сообщение отредактировал(а) kefir01 - 26.11.2008, 18:54
PM MAIL   Вверх
xvr
Дата 27.11.2008, 14:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Alca @ 26.11.2008,  16:57)
Код

//---------------------------------------------------------------------------
char сHexToChar(char *pszStr) {
    //-------------------------------------
    //CHECK
    if (NULL == pszStr || 0 == strlen(pszStr)) {
        return 0;
    }

    //-------------------------------------
    //
    char ch;

    if (pszStr[0] >= 'A') {
        ch = ((pszStr[0] & 0xdf) - 'A') + 10;
    } else {
        ch = pszStr[0] - '0';
    }

    ch <<= 4;

    if (pszStr[1] >= 'A') {
        ch += ((pszStr[1] & 0xdf) - 'A') + 10;
    } else {
        ch += pszStr[1] - '0';
    }

    return ch;
}
//%FF%E4%F0%E5%ED%E0%20%62%75%67%73 -> "ядрена bugs"
std::string sBase64Decode(const std::string &сsStr) {
    std::string sRes("");
    sRes.assign(сsStr);
  
    unsigned int uiSrc  = 0;
    unsigned int uiDest = 0;
    char         ch     = 0;
    for (uiSrc = 0, uiDest = 0; sRes[uiSrc]; uiSrc ++, uiDest ++)   {
        ch = sRes[uiSrc];
        ch = (ch == '+') ? ' ' : ch;
        sRes[uiDest] = ch;
        
        if (ch == '%')    {
            sRes[uiDest] = сHexToChar(&sRes[uiSrc + 1]);
            uiSrc += 2;
        }
    }
    sRes[uiDest] = '\0';        //отрезаем все что идет после '\0'
    
    return std::string(sRes.c_str());    //возвращаем Си-шную строку, все до нуля    
}
//---------------------------------------------------------------------------

Компилил VS 2005.

Это URL Escape, а не Base64!

PM MAIL   Вверх
mrbrooks
Дата 28.11.2008, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



На всякий случай - лучше инклюдить хедар так - что бы не было ошибки линковки .
Код

#include "EncdDecd.hpp"

AnsiString text = "фак мой мозг!";
AnsiString encoded = EncodeString(text);
AnsiString decoded = DecodeString(encoded);

PM MAIL   Вверх
MoLeX
Дата 28.11.2008, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 1
Всего: 140



Цитата(mrbrooks @  28.11.2008,  09:44 Найти цитируемый пост)
На всякий случай - лучше инклюдить хедар так - что бы не было ошибки линковки .

угу.. у меня так и произошло. спасибо за совет.



--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
3315720
Дата 28.11.2008, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 28.2.2008

Репутация: нет
Всего: нет



Во вкладке Indy Misc, есть IdBase64Encode и IdBase64Decode.
PM MAIL   Вверх
xvr
Дата 28.11.2008, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(3315720 @ 28.11.2008,  10:35)
Во вкладке Indy Misc, есть IdBase64Encode и IdBase64Decode.

Они с глюками - большие объемы данных обрезаются. На это уже тут кто то наступал  smile 
PM MAIL   Вверх
MoLeX
Дата 28.11.2008, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 1
Всего: 140



Цитата(3315720 @  28.11.2008,  10:35 Найти цитируемый пост)
Во вкладке Indy Misc, есть IdBase64Encode и IdBase64Decode. 

вот они и работают у меня на половину... 


3315720, так то вопрос решен  smile 


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Alca
Дата 28.11.2008, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 25
Всего: 50



Код

int Base64Coder(std::string &src, std::string &dest) 
{ 
   static const char  base64_encode_table[] = {'A', 'B', 'C', 'D', 'E', 'F', 
      'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 
      'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 
      'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 
      'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' }; 

   std::string::iterator       end = src.end(); 
    std::string::iterator       p = src.begin(); 
    unsigned long               dword; 
    int                         i = 0; 
    int                         ls = 0; 

    while ( p != end ) 
    { 
        if ( 76 <= ls ) 
        { 
            dest += '\r'; 
            dest += '\n'; 
            ls = 0; 
        } 

        dword = (dword << 8) ^ ( (unsigned char)(*p++)), i ++; 

        int     pad = 0; 
        if ( p == end ) 
        for ( ;i < 3; ++i, ++pad ) 
        { 
            dword = (dword << 8) & 0xFFFFFF00; 
        } 

        if (3 <= i) 
        { 
            for (i = 4; i > 0; i--) 
            { 
                if (i <= pad) 
                { 
                    dest += '='; 
                } 
                else 
                { 
                    char t = (char)( (dword >> ( i*6 - 6) ) & 0x3F ); 
                    dest += base64_encode_table[t]; 
                } 
            } 

            ls += 4; 
        } 

    } 

    dest += '\r'; 
    dest += '\n'; 

    return 1; 
} 
//////////////////////////////////////////////////////////////////////////// 
int Base64Decoder(std::string &src, std::string &dest) 
{ 
   static const char base64_decode_table[] = { 
      -1, -1, -1, -1, -1, -1, -1, -1,  //0 - 
      -1, -1, -1, -1, -1, -1, -1, -1, 
      -1, -1, -1, -1, -1, -1, -1, -1, 
      -1, -1, -1, -1, -1, -1, -1, -1, 
      -1, -1, -1, -1, -1, -1, -1, -1, 
      -1, -1, -1, 62, -1, -1, -1, 63, // - 47 
      52, 53, 54, 55, 56, 57, 58, 59, // - 55 
      60, 61, -1, -1, -1, -1, -1, -1, // - 63 

      -1,  0,  1,  2,  3,  4,  5,  6, // 64 - 
      7,  8,  9, 10, 11, 12, 13, 14, 
      15, 16, 17, 18, 19, 20, 21, 22, 
      23, 24, 25, -1, -1, -1, -1, -1, 
      -1, 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, -1, -1, -1, -1, -1 // - 127 
   }; 

   std::string::iterator       end = src.end(); 
    std::string::iterator       p = src.begin(); 
    unsigned long               dword; 
    int                         i = 0; 
    int                         pad = 0; 

    while ( p != end ) 
    { 
        if ('\r' == *p || '\n' == *p) 
        { 
            p++; 
            continue; 
        } 

        if ( '=' == *p ) 
        { 
            dword = ((dword << 6) & 0xFFFFFFC0); 
            pad++; 
            p++; 
        } 
        else if ( 0x80 <= *p || 0xFF == base64_decode_table[*p] ) 
        { 
            p++; 
            continue; 
        } 
        else 
        { 
            dword = ((dword << 6) & 0xFFFFFFC0) ^ 
                (base64_decode_table[*p++]); 
        } 

        if ( 4 == ++i ) 
        {    
            while (i-- > pad + 1) 
            { 
                char t = (char)(( dword >> (8*i-8) ) & 0xFF ); 
                dest += (char)t; 
            } 
            i = dword = pad = 0; 
        } 
    } 

    return 1; 
}

и еще:
Base64.zip


Это сообщение отредактировал(а) Alca - 3.12.2008, 16:28

Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  Base64.zip 2,27 Kb


--------------------
PM WWW ICQ Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.3750 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.