Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа с битами 
:(
    Опции темы
Yline
Дата 18.2.2007, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 3.2.2007
Где: г. Екатеринбург

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



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

компилируется нормально, но при выполнение ошибочка, в чем проблемма?

код sgraf.cpp
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#include <cstring.h>
#include "stdio.h"
#include "sgraf.h"
#pragma hdrstop

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//-----------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton2Click(TObject *Sender)
{
 if (OpenDialog1->Execute())
   {
   inFileName1 = OpenDialog1->FileName.c_str();
   Edit1->Text = OpenDialog1->FileName.c_str();
   }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton3Click(TObject *Sender)
{
 if (OpenDialog2->Execute())
   {
   inFileName2 = OpenDialog2->FileName.c_str();
   Edit2->Text = OpenDialog2->FileName.c_str();
   }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton4Click(TObject *Sender)
{
  if (OpenDialog3->Execute())
   {
   outFileName = Edit3->Text.c_str();
   }
}
//---------------------------------------------------------------------------
sgraf::sgraf(void)
{
    size1 = size2 = index1 = index2 = index3 = 0;
    endProcess = false;
}
//-----------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
 sgraf *cl = new sgraf();
 cl->Init(inFileName1, inFileName2, outFileName);
 cl->Process();
 cl->End();
 delete cl;
}
//---------------------------------------------------------------------------
sgraf::~sgraf(void)
{
}
//-----------------------------------------------------------------------------

void sgraf::Init(const char *inFileName1, const char *inFileName2, const char *outFileName)
{
    FILE *result;
    result = fopen(inFileName1, "rb");
    result = fopen(inFileName2, "rb");
    result = fopen(outFileName, "wb");
    endProcess = false;
}
//-----------------------------------------------------------------------------

bool sgraf::ReadNextByte1(char *value)
{
    bool result = false;
    *value = 0;
    if(size1 == 0 || index1 == size1)
    {
        size1 = fread(&inBuffer1, sizeof(char), bufsize, inFile1);
        index1 = 0;
    }
    if(size1 == 0)
        endProcess = true;
    else
    {
        *value = inBuffer1[index1++];
        result = true;
    }
    return result;
}
//-----------------------------------------------------------------------------

bool sgraf::ReadNextByte2(char *value)
{
    bool result = false;
    *value = 0;
    if(size2 == 0 || index2 == size2)
    {                                
        size2 = fread(&inBuffer2, sizeof(char), bufsize, inFile2); 
        index2 = 0;
    }                             
    if(size2 == 0)
        endProcess = true;
    else
    {
        *value = inBuffer2[index2++];
        result = true;
    }
    return result;
}
//-----------------------------------------------------------------------------

void sgraf::WriteNextByte(char value)
{
    if(index3 < bufsize)
        outBuffer[index3++] = value;
    else
    {
        fwrite(&outBuffer, sizeof(char), bufsize, outFile);
        index3 = 0;
    }
}
//-----------------------------------------------------------------------------

void sgraf::Process()
{
    char inByte1 = 0, inByte2 = 0, outByte = 0;
    while(ReadNextByte2(&inByte2) && !endProcess)
    {
        for(int i=0; i<8 && ReadNextByte1(&inByte1) && !endProcess; i++)
        {
            outByte = (inByte1 & 0x7f) | (inByte2 & 0x80);
            inByte2 = inByte2 << 1;
            WriteNextByte(outByte);
        }
    }
}
//-----------------------------------------------------------------------------

void sgraf::End(void)
{
    fclose(inFile1);
    fclose(inFile2);
    if(index3 > 0)
        fwrite(&outBuffer, sizeof(char), index3, outFile);
    fclose(outFile);
}
//---------------------------------------------------------------------------


код sgraf.h
Код

//---------------------------------------------------------------------------

#ifndef sgrafH
#define sgrafH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Buttons.hpp>
#include <Dialogs.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TLabel *Label1;
        TLabel *Label2;
        TLabel *Label3;
        TSpeedButton *SpeedButton1;
        TEdit *Edit1;
        TEdit *Edit2;
        TEdit *Edit3;
        TSpeedButton *SpeedButton2;
        TSpeedButton *SpeedButton3;
        TSpeedButton *SpeedButton4;
        TOpenDialog *OpenDialog1;
        TOpenDialog *OpenDialog2;
        TOpenDialog *OpenDialog3;
        void __fastcall SpeedButton2Click(TObject *Sender);
        void __fastcall SpeedButton3Click(TObject *Sender);
        void __fastcall SpeedButton4Click(TObject *Sender);
        void __fastcall SpeedButton1Click(TObject *Sender);
private:    // User declarations
public:        // User declarations
        __fastcall TForm1(TComponent* Owner);
        const char* inFileName1;
        const char* inFileName2;
        const char* outFileName;
};

#pragma once
//---------------------------------------------------------------------------
class sgraf
{
public:
    sgraf(void);
    ~sgraf(void);
    void Init(const char *inFileName1, const char *inFileName2, const char *outFileName);
    void Process();
    void End();
private:
    static const int bufsize = 4096;
    char inBuffer1[bufsize];
    char inBuffer2[bufsize];
    char outBuffer[bufsize];

    bool ReadNextByte1(char *value);
    bool ReadNextByte2(char *value);
    void WriteNextByte(char value);

    size_t size1, index1;
    size_t size2, index2;
    size_t index3;

    FILE *inFile1;
    FILE *inFile2;
    FILE *outFile;

    bool endProcess;
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

PM MAIL ICQ   Вверх
FFFFFFF7
Дата 18.2.2007, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Yline, ты б хоть отладку провел... Хотя б брейкпоинтами. 
Весь код перелопачивать за тебя? smile 
 fwrite(&outBuffer, sizeof(char), bufsize, outFile);
fwrite(буфер, размер, кол-во повторений записи, поток);
Ни чего странного?
--------------------
Да помоги кодеру, а значит - ближнему своему!
PM MAIL   Вверх
Yline
Дата 18.2.2007, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 3.2.2007
Где: г. Екатеринбург

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



то что останавливается здесь:
size2 = fread(&inBuffer2, sizeof(char), bufsize, inFile2);
я знал, но обычно просят показать код, вот я сразу его и показал smile 

но почему вот что-то непойму
&outBuffer - указатель памяти,
bufsize - количество блоков подлежащих считыванию,
sizeof(char) - длина блоков,
outFile - поток.

где ж тут странность, ну хоть примерно smile 
PM MAIL ICQ   Вверх
Anikmar
Дата 18.2.2007, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Yline @  18.2.2007,  15:33 Найти цитируемый пост)
sizeof(char) - длина блоков,

Вот тут как раз и странность.
sizeof(char) в общем то равен 1...

Это сообщение отредактировал(а) Anikmar - 18.2.2007, 17:30
PM MAIL ICQ   Вверх
Yline
Дата 19.2.2007, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 3.2.2007
Где: г. Екатеринбург

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



Цитата(Anikmar @ 18.2.2007,  17:29)
Вот тут как раз и странность.
sizeof(char) в общем то равен 1...

почему странность, блок не может быть длиной 1 байт?
PM MAIL ICQ   Вверх
FFFFFFF7
Дата 19.2.2007, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



YlineYline,  вкуривай пока это smile :
Цитата(FFFFFFF7 @  18.2.2007,  14:49 Найти цитируемый пост)
fwrite(буфер, размер, кол-во повторений записи, поток);


--------------------
Да помоги кодеру, а значит - ближнему своему!
PM MAIL   Вверх
Yline
Дата 20.2.2007, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 3.2.2007
Где: г. Екатеринбург

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



че-то никак не вкурю  smile 
PM MAIL ICQ   Вверх
Yline
Дата 20.2.2007, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 3.2.2007
Где: г. Екатеринбург

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



вкурил  smile 
Код

void sgraf::Init(const char *inFileName1, const char *inFileName2, const char *outFileName)
{
    inFile1 = fopen(inFileName1, "rb");
    inFile2 = fopen(inFileName2, "rb");
    outFile = fopen(outFileName, "wb");
    endProcess = false;
}

PM MAIL ICQ   Вверх
Yline
Дата 22.2.2007, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 3.2.2007
Где: г. Екатеринбург

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



файл немножко подправил:
Код

void sgraf::Process()
{   int cout = 0;
    char inByte1 = 0, inByte2 = 0, outByte = 0;
    while(ReadNextByte2(&inByte2) && !endProcess)
    {
        for(int i=0; i<8 && ReadNextByte1(&inByte1) && !endProcess; i++)
        {
            cout++;
            if (cout > 100) //пропускаю сто байт где хранится инфа о bmp файле
            {
            outByte = (inByte1 & 0x7f) | (inByte2 & 0x80);
            inByte2 = inByte2 << 1;
            }
            else outByte = inByte1;
            WriteNextByte(outByte);
        }
    }
    if (!ReadNextByte2(&inByte2)) //дописываю остаток оригинального файла
    {
        while (ReadNextByte1(&inByte1))
        {
        outByte = inByte1;
        WriteNextByte(outByte);
        }
    }
}


но куда то теряется около 1000 байт и bmp все равно не показывается
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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