Модераторы: feodorv

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Целый файл в Base64... Нужна помошь. 
V
    Опции темы
drZmeu
  Дата 14.1.2007, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Привет народ и мне снова потребовалась помошь более опытных людей чем я  smile 
Вобшем убил день в пустую но так ничего толком и не нашёл  smile 

Есть несколько примерчиков: 
Код

#include "stdafx.h"
#include <windows.h>
using namespace std;

static void base64_t2q(BYTE *t, BYTE *q)
{
    BYTE Base64ABC[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    q[0] = Base64ABC[t[0] >> 2];
    q[1] = Base64ABC[((t[0] & 03) << 4) | (t[1] >> 4)];
    q[2] = Base64ABC[((t[1] & 017) << 2) | (t[2] >> 6)];
    q[3] = Base64ABC[t[2] & 077];
}

static int msg_b64enc(char outbuf[1024], char filename[1024])
{
    HANDLE hIn;
    BYTE inbuf[1024], t[3], q[3];
    DWORD tp, inp, inlen, outp, i, linepos;
    const DWORD linelen = 76;

    hIn = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, NULL); //Открываем для чтения
    if (hIn == INVALID_HANDLE_VALUE) return 1;

    for (tp=0, inp=0, inlen=0, outp=0, linepos=0;;) 
        {
        
        if (inp >= inlen) {
            ReadFile(hIn, inbuf, sizeof(inbuf), &inlen, NULL);
            if (inlen == 0) break;
            inp = 0;
        }
        t[tp++] = inbuf[inp++];
        if (tp == 3) {
            base64_t2q(t, q);
            for (i=0; i<4; i++) {
                outbuf[outp++] = q[i];
                if (++linepos >= linelen) 
                {
                    outbuf[outp++] = '\r';
                    outbuf[outp++] = '\n';
                    linepos = 0;
                }
            }
            memset(t, 0, sizeof(t));
            tp = 0;
        }
    }

    if (tp) {
        base64_t2q(t, q);
        if (tp < 3) q[3] = '=';
        if (tp < 2) q[2] = '=';
        for (i=0; i<4; i++)
            outbuf[outp++] = q[i];
    }

    outbuf[outp] = 0;

    CloseHandle(hIn);
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    char h[1024];
    char fname[1024];
    cout<<"\nEnter File nema: ";
    cin>>fname;
    msg_b64enc(h,fname);
    cout<<h<<endl;
    int i;
    cin>>i;

    return 0;
}


Этот пример не подходит для перевода очень больших файлов =( Вылетает из среды с ошибками =\
Вопрос почему и можно ли его както упростить и переделать чтоб он мог работать с большими файлами... А вот если кто сможет опишите детально этот пример что в нём происходит на какой строке ато у меня ещё остались проблемы =\
Вот и всё что хотелось сказать...
Спасибо за уделённое внимание...
Ах да чуть незабыл код должен работать с большими объёмами для того чтоб клеить файлы к письму в аттаче =\
--------------------
[code=html]<table bgcolor='#0' width='69'><tr align='center' bgcolor='#0'><td><font size='6' face='cursive' color='#ffffff'><b>A</b></font></td></tr><tr align="center" bgcolor="#0">[/code]
PM MAIL   Вверх
jonie
Дата 15.1.2007, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Этот пример не подходит для перевода очень больших файлов =( Вылетает из среды с ошибками =\
ессно дело - буфер длиной 1024 передается же...
Цитата

Вопрос почему и можно ли его както упростить и переделать чтоб он мог работать с большими файлами... 
я делал так:
Код

#ifndef __BASE64__H__
#define __BASE64__H__

namespace base64
{
  const char to_table[64] = 
  {
    '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', '+', '/'
  };

  const char from_table[128] =
  {
    -1, -1, -1, -1, -1, -1, -1, -1, // 0
    -1, -1, -1, -1, -1, -1, -1, -1, // 8
    -1, -1, -1, -1, -1, -1, -1, -1, // 16
    -1, -1, -1, -1, -1, -1, -1, -1, // 24
    -1, -1, -1, -1, -1, -1, -1, -1, // 32
    -1, -1, -1, 62, -1, -1, -1, 63, // 40
    52, 53, 54, 55, 56, 57, 58, 59, // 48
    60, 61, -1, -1, -1,  0, -1, -1, // 56
    -1,  0,  1,  2,  3,  4,  5,  6, // 64
     7,  8,  9, 10, 11, 12, 13, 14, // 72
    15, 16, 17, 18, 19, 20, 21, 22, // 80
    23, 24, 25, -1, -1, -1, -1, -1, // 88
    -1, 26, 27, 28, 29, 30, 31, 32, // 96
    33, 34, 35, 36, 37, 38, 39, 40, // 104
    41, 42, 43, 44, 45, 46, 47, 48, // 112
    49, 50, 51, -1, -1, -1, -1, -1  // 120
  };

  typedef unsigned char BYTE;
  typedef unsigned short WORD;
  typedef unsigned int  DWORD;
 
  template <class InputIterator, class OutputIterator>
  void encode(const InputIterator& begin, 
              const InputIterator& end, 
              OutputIterator out)
  {
        InputIterator it = begin;
        int lineSize = 0;    //длинна строки
        int n_bytes;        //кол-во байт взятых
        DWORD dwInput;        //для сохранения 3-х байт
        do{
            dwInput = 0;
            //берем три байта
            for(n_bytes = 0; (n_bytes<3)&&(it != end) ; ++n_bytes,++it){
                dwInput <<= 8;
                dwInput += static_cast<BYTE>(*it);
            }

            //кодируем в BASE64
            int n_bits = n_bytes*8;
            while (n_bits > 0){
                n_bits-=6;
                BYTE index = ((n_bits < 0) ? dwInput << -n_bits : dwInput >> n_bits) & 0x3F;
                *out =  to_table[index];
                ++out;
                ++lineSize;
            }
            
            //строка больше или равна 76 симаолам?
            if(lineSize >= 76){
                //*out = 0x0D;
                ++out;
                *out = 0x0A;
                ++out;
                lineSize = 0;
            }

        }while(n_bytes==3);

        //установим последнюю строку, если надо
        if(n_bytes){
            while(n_bytes++<3){
                *out = '=';
                ++out;
            }
        }
  }

  template <class InputIterator, class OutputIterator>
  void decode(const InputIterator& begin, 
              const InputIterator& end, 
              OutputIterator out)
  {
      InputIterator it = begin;
      int n_bytes = 0;
      BYTE c;
      do{
            n_bytes = 0;
            BYTE input[4] = {0, 0, 0, 0};
            //получаем 4 байта
            while( (n_bytes < 4)&&(it != end) ){
                if( (c = static_cast<BYTE>(*it)) == '=' )break;    //эти сомволы нафиг не нужны
                it++;
                for(int i=0;i<sizeof(to_table);i++){
                    if( c == to_table[i]){        //символ подходящий вообще
                        input[n_bytes] = from_table[c];
                        n_bytes++;
                        break;
                    }
                }
            }

            //получаем бинарные данные
            if (n_bytes >= 2)
            {
                *out = static_cast<BYTE>((input[0] << 2) + (input[1] >> 4));
                ++out;
                if (n_bytes >= 3)
                {
                    *out = static_cast<BYTE>((input[1] << 4) + (input[2] >> 2));
                    ++out;
                    if (n_bytes >= 4)
                    {
                        *out = static_cast<BYTE>((input[2] << 6) + input[3]);
                        ++out;
                    }
                }
            }

      }while(n_bytes==4);
  }


}    //end base64 namespace


#endif //__BASE64__H__

а далее скажем так:
Код

#include "base64.h"

int main()
{
    ifstream in("base64.bin",ios::binary);
    noskipws(in);
    ofstream out("base64.txt");

    base64::encode( istream_iterator<unsigned char>(in),
                    istream_iterator<unsigned char>(), 
                    ostream_iterator<unsigned char>(out));

    in.close();
    out.close();
    return 0;
}

и не парился)) ну и по аналогии доделывай..


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
drZmeu
Дата 15.1.2007, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Извени но это слишком большой код  smile  
Нужно что-то короче...
Значит я смогу зазширить буфер и занести туда больше информации =\
Ладно жду примеров и т.д =)

--------------------
[code=html]<table bgcolor='#0' width='69'><tr align='center' bgcolor='#0'><td><font size='6' face='cursive' color='#ffffff'><b>A</b></font></td></tr><tr align="center" bgcolor="#0">[/code]
PM MAIL   Вверх
jonie
Дата 15.1.2007, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Извени но это слишком большой код  
что значит слишком большой?) там же и кодирование и декодирование) так что не особо и больше...
Цитата

Значит я смогу зазширить буфер и занести туда больше информации =\
ну расширь... скажем до 100 Гб ....а может до 200.....  smile ... а может до 300....
"Дай Бог памяти" - молитва программиста. удачи.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
ptr
Дата 15.1.2007, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

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



Ничего не понял smile . Как между собой связаны base64 и размер файла?

Цитата(drZmeu @  15.1.2007,  00:22 Найти цитируемый пост)
Этот пример не подходит для перевода очень больших файлов =( Вылетает из среды с ошибками =\

Что за ошибки?

Это сообщение отредактировал(а) ptr - 15.1.2007, 15:53


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
jonie
Дата 15.1.2007, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



какие - какие... ужель по заголовку непонять?)
static int msg_b64enc(char outbuf[1024], char filename[1024]).
стек портится) такая вот имхо "кривая"реализация просто. smile 
ЗЫ: может сделать callback если уж так хочется буфер в 1024 байт....?)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
drZmeu
Дата 15.1.2007, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я хочу чтоб я мог приотатчить файл размером ну в 100 килобайт вот как это сделать =\
Помогите чтоли... smile 
--------------------
[code=html]<table bgcolor='#0' width='69'><tr align='center' bgcolor='#0'><td><font size='6' face='cursive' color='#ffffff'><b>A</b></font></td></tr><tr align="center" bgcolor="#0">[/code]
PM MAIL   Вверх
drZmeu
Дата 15.1.2007, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Unhandled exception at 0x7c9378ae in b64.exe: 0xC0000005: Access violation writing location 0x00030ff8.

Вот ошибка =\\ smile 
--------------------
[code=html]<table bgcolor='#0' width='69'><tr align='center' bgcolor='#0'><td><font size='6' face='cursive' color='#ffffff'><b>A</b></font></td></tr><tr align="center" bgcolor="#0">[/code]
PM MAIL   Вверх
ptr
Дата 17.1.2007, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

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



Цитата(drZmeu @  16.1.2007,  00:28 Найти цитируемый пост)
Я хочу чтоб я мог приотатчить файл размером ну в 100 килобайт вот как это сделать =\

Найди нормальную реализацию и можешь кодировать хоть гигабайтные файлы.


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
jonie
Дата 17.1.2007, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Найди нормальную реализацию и можешь кодировать хоть гигабайтные файлы.
чем скажем плоха моя?)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
ptr
Дата 18.1.2007, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

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



Цитата(jonie @  18.1.2007,  00:01 Найти цитируемый пост)
чем скажем плоха моя?)

Я ничего плохого про твою реализацию не говорил smile . Хотя есть некоторые моменты smile .


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
drZmeu
Дата 19.1.2007, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Блин народ хватит дискутировать вы мне с моей реализацией помогите  plizzzzzzzzz.
Мне гигобайты ненадо максимум 178 килобайт это придел.
Но нужен код поменьше =\

--------------------
[code=html]<table bgcolor='#0' width='69'><tr align='center' bgcolor='#0'><td><font size='6' face='cursive' color='#ffffff'><b>A</b></font></td></tr><tr align="center" bgcolor="#0">[/code]
PM MAIL   Вверх
W4FhLF
Дата 19.1.2007, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



http://base64.sourceforge.net/b64.c
http://koders.com/default.aspx?s=base64&am...=Cpp&li=%2A

Это сообщение отредактировал(а) W4FhLF - 19.1.2007, 22:52


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
drZmeu
Дата 21.1.2007, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Уря  наконецто W4FhLF пасибо огромное...
Короче начеркал  я примерчик точнее облегчил пример W4FhLF только для кодирования файла вобшем возник такой вопрос по сколько символов должна быть строка в base64 72 или 74 символа???
Короче вот пример жду поправлений и замечаний =)

Код

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
using namespace std;
static const char cb64[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
void encodeblock( unsigned char in[3], unsigned char out[4], int len )
{
    out[0] = cb64[ in[0] >> 2 ];
    out[1] = cb64[ ((in[0] & 0x03) << 4) | ((in[1] & 0xf0) >> 4) ];
    out[2] = (unsigned char) (len > 1 ? cb64[ ((in[1] & 0x0f) << 2) | ((in[2] & 0xc0) >> 6) ] : '=');
    out[3] = (unsigned char) (len > 2 ? cb64[ in[2] & 0x3f ] : '=');
}

void encode( FILE *infile, FILE *outfile, int linesize )
{
    unsigned char in[3], out[4];
    int i, len, blocksout = 0;

    while( !feof( infile ) ) {
        len = 0;
        for( i = 0; i < 3; i++ ) {
            in[i] = (unsigned char) getc( infile );
            if( !feof( infile ) ) {
                len++;
            }
            else {
                in[i] = 0;
            }
        }
        if( len ) {
            encodeblock( in, out, len );
            for( i = 0; i < 4; i++ ) {
                putc( out[i], outfile );
            }
            blocksout++;
        }
        if( blocksout >= (linesize/4) || feof( infile ) ) {
            if( blocksout ) {
                fprintf( outfile, "\r\n" );
            }
            blocksout = 0;
        }
    }
}



int b64(char infilename[64], char outfilename[64])
{
FILE *infile;
FILE *outfile;
int size;
infile = fopen( infilename, "rb" );
outfile = fopen( outfilename, "wb" );
fseek(infile,SEEK_END,0);
size = ftell(infile);
fseek(infile,SEEK_SET,0);
int i;
cout<<size<<endl;
cin>>i;
encode( infile, outfile, 74 );
return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    char INFILE[64],OUTF[64];
    int linesaize;
    cout<<"Endter OUT FILE: ";
    cin>>INFILE;
    cout<<"Endter IN FILE: ";
    cin>>OUTF;
    b64(INFILE,OUTF);
    return 0;
}


Если всё правильно то начну переводить в WinAPI открытие файла , чтение и т.д
Жду ответа правильно ли он кодирует или нет?

Добавлено @ 11:40 
Ой или файл кодируется по 76 символов =\
--------------------
[code=html]<table bgcolor='#0' width='69'><tr align='center' bgcolor='#0'><td><font size='6' face='cursive' color='#ffffff'><b>A</b></font></td></tr><tr align="center" bgcolor="#0">[/code]
PM MAIL   Вверх
drZmeu
Дата 21.1.2007, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



И снова трабл но уже не с кодировкой хотя =\
Короче все мы знаем что на smtp.mail.ru нужна авторизация для того чтоб отправить письмо =(
Вобшем трабла такая что вроде всё должно проходить но не проходит вобшем вот:
//----------------------------------------------
S: 220
U: helo hdp
S: 250
U: AUTH LOGIN
S: 344
U: *********
S: 344
U: *********
S: 235
U: MAIL FROM:<[email protected]>
S: 250 OK
U: RCPT TO:<[email protected]>
S: 250
U: DATA
S: 354
U: "TXT"
U: .
//-----------------------------------------------
Это сессия чата с smtp сервером =\ Проблема возникает после AUTH LOGIN этот запрос отправляется серверу но после запрашивается логин а после пароль в base64 тоесть \r\n не проходит и \r\n\r\n тоже не проходит ибо вся эта бойдень должна быть в base 64 что делать как авториоватся  smile  помогите  plz.
--------------------
[code=html]<table bgcolor='#0' width='69'><tr align='center' bgcolor='#0'><td><font size='6' face='cursive' color='#ffffff'><b>A</b></font></td></tr><tr align="center" bgcolor="#0">[/code]
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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