Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как представить любой файл в двоичном коде??? 
:(
    Опции темы
mn2
Дата 6.3.2006, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

ОГРОМНАЯ ПРОСЬБА!!!

ПОМОГИТЕ ЭТО СДЕЛАТЬ!!!

Заранее благодарю.
PM MAIL   Вверх
_hunter
Дата 7.3.2006, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



поможем -- не вопрос.
что именно тебе не понятно?
+ поиском пользуемся:
http://forum.vingrad.ru/index.php?showtopic=59909
http://forum.vingrad.ru/index.php?showtopic=54632


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
chwind
Дата 7.3.2006, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



1)Любой файл текстовый графический и т.д. храниться на диске как бинарный файл.
2) отсюда следует что лбой файл с люым расширением можно открыть как бинарный файл.

В Буилде есть масса способов открыть файл как бинарный, давай остановимся на методах которые предоставляет класс TFileStream, а заодно и пропишем функцию перевода байта в строковую последовательность нолей и едениц

Код

String ByteToBitStr(BYTE _b)
{
  String rez = "";
  for (int i = 0; i<8; i++)
  {
    if (_b&128)
      rez = rez+"1";
    else
      rez = rez+"0";
    _b<<=1;
  }
}

TFileStream  * fs = new TFileStream ("c:\\photo.jpg",fmOpenReadWrite);
BYTE b;
String bs;
for (int i = 0; i<fs->Size;i++)
{
  fs->Read(&b,1);
  bs = ByteToBitStr();
}
delete fs;

ну вот так вот, на вскидку преобразовали бинарник в строки нолей и нединиц smile(правда читать побайтово немного медленно лучше читать блоками такчто текст еще можно оптимизировать)
Назад думаю и сам справишься, но хочу предупредить - это все стоит делать только для того чтобы дать пользователю в редакторе менять 0 на 1 и обратно, ежели твоя программа сама будет делать эти замены, то лучше обойтись без строк, компу легче иметь дело непосредственно с битами smile

Это сообщение отредактировал(а) chwind - 7.3.2006, 12:38
PM MAIL   Вверх
mn2
Дата 9.3.2006, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ещё раз спасибо за помощь.
Всё работает.
Но есть непонятности:
во-первых, что за тип такой BYTE?
во-вторых, что значит выражение _b&128?
И, плиз, скажите, а реально это же реализовать без класса TFileStream, лучше всего через стандартные потоки, хоть в стиле С, хоть в С++, не важно.

Это сообщение отредактировал(а) mn2 - 9.3.2006, 10:48
PM MAIL   Вверх
chwind
Дата 9.3.2006, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



BYTE это все равно что unsigned char
на самом деле BYTE - дефайн, описан он гдето в classes.hpp если не ошибаюсь
выглядит так
#define BYTE unsigned char

выражение _b&128 значит что переменная _b складывается побитно с константой 128 , тоесть 10000000 в бинарном виде. Тоесть результатом операции может быть или 00000000 или 10000000 в зависимости от того сброшен или установлен старший бит в переменной _b соответственно.

Реализовать чтение можно разными методами, поищи в хелпе read, stream.
З.Ы. Не пойму, чем тебе не нравиться TFileStream ?

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


Новичок



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

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



Спасибо за исчерпывающий ответ smile

Просто я больше привык работать с обычными потоками.

Это сообщение отредактировал(а) mn2 - 10.3.2006, 15:50
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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