Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сборка и разборка файлов 
:(
    Опции темы
Slippy
Дата 24.2.2011, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вопрос вот в чем: нужно написать стеганографическую программку, чтобы прятать в изображение какой-нибудь файлик...С изображением проблем нет, раскладываю каждый пиксель на составляющие и записываю их в двоичном виде в 3 массива (R, G, B), но суть не в этом...
Как мне представить любой файл (или хотя бы текстовый) в таком же виде (в виде ноликов и единичек, они же байты), потом умудриться это все собрать обратно в файл?

P.S.: если уже были подобные темы, дайте ссылки, будьте добры, а то уже ниче не соображаю :(
PM MAIL   Вверх
CodeMonkey
Дата 24.2.2011, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Никак. Любая информация - это уже и есть набор байт. Ничего с ним делать не надо, никак преобразовывать тоже не надо.

Просто работай с информацией как с набором байт - вот и всё.

Если речь идёт о загрузке из файла - грузи в массив байт. Если речь идёт о работе с информацией в памяти - используй преобразования типов.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Slippy
Дата 25.2.2011, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(CodeMonkey @ 24.2.2011,  23:00)
Просто работай с информацией как с набором байт - вот и всё.

А можно с примером пожалуйста?
Вот есть файл, и как его в байтах-то рассматривать?

Это сообщение отредактировал(а) Slippy - 25.2.2011, 00:54
PM MAIL   Вверх
northener
Дата 25.2.2011, 02:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Slippy @  25.2.2011,  00:49 Найти цитируемый пост)
А можно с примером пожалуйста?
Вот есть файл, и как его в байтах-то рассматривать?

BlockRead/BlockWrite - это самый древний, но и самый проверенный вариант.
Только вот "текстовую информацию" просто так (как вы прячете изображение) не удастся спрятать.



--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
CodeMonkey
Дата 25.2.2011, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код
// Раскомментарить, если твоя Delphi не знает TBytes
// type
//  TBytes = array of Byte; 

function FileToBytes(const AFileName: String): TBytes; 
var
  FS: TFileStream;
begin
  FS := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite);
  try
    SetLength(Result, FS.Size);
    if FS.Size > 0 then
      FS.ReadBuffer(Result[1], FS.Size);
  finally
    FreeAndNil(FS);
  end;
end;

...

var
  S: TBytes;
begin
  S := FileToString('C:\Data.bin');
  Byte(S[0]) - первый байт
  Byte(S[1]) - второй байт


или:

Код
{$IFNDEF UNICODE}
type
  RawByteString = AnsiString;
{$ENDIF}

function FileToString(const AFileName: String): RawByteString;
var
  FS: TFileStream;
begin
  FS := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite);
  try
    SetLength(Result, FS.Size);
    if FS.Size > 0 then
      FS.ReadBuffer(Result[1], FS.Size);
  finally
    FreeAndNil(FS);
  end;
end;

...

var
  S: RawByteString;
begin
  S := FileToString('C:\Data.bin');
  Byte(S[1]) - первый байт
  Byte(S[2]) - второй байт




--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
500mhz
Дата 25.2.2011, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

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



мне тоже интересно как ТС собрался в файл TXT что то прятать?


--------------------

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


Новичок



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

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



Цитата(CodeMonkey @ 25.2.2011,  12:01)
Код
{$IFNDEF UNICODE}
type
  RawByteString = AnsiString;
{$ENDIF}

function FileToString(const AFileName: String): RawByteString;
var
  FS: TFileStream;
begin
  FS := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite);
  try
    SetLength(Result, FS.Size);
    if FS.Size > 0 then
      FS.ReadBuffer(Result[1], FS.Size);
  finally
    FreeAndNil(FS);
  end;
end;

...

var
  S: RawByteString;
begin
  S := FileToString('C:\Data.bin');
  Byte(S[1]) - первый байт
  Byte(S[2]) - второй байт

Воспользовался этим кодом, все работает.
Я так понимаю, прога выдает байты в десятичной системе? (привожу скрин, пробовал на 17 байтовом тестовичке)
И тестил на других расширениях файлов, вроде тоже работает.

Спасибо большое!

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  __________.jpg 15,73 Kb
PM MAIL   Вверх
CodeMonkey
Дата 25.2.2011, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

Ты пойми, что сами байты не меняются. Они как есть, так и будут. А уж как ты их будешь интерпретировать - от этого всё и зависит. Вот ты можешь рассмотреть первые четыре байта файла как целочисленный Integer и показать его на экране в десятичной системе IntToStr-ом. А можешь интерпретировать как Cardinal и показать на экране в шестнадцатеричной системе IntToHex-ом. Да хоть в системе по основанию корень из двух - это твоё дело. Сами байты от этого не меняются. Никак.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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