Запись hex-кода в файл
|
|
Andrey_M | Дата: Среда, 12 Декабря 2012, 22:13 | Сообщение # 1 |
старожил
Сейчас нет на сайте
| Итак, как я уже говорил, я пилю текстовый редактор.
Для некоторых целей мне требуется в сиём текстовом редакторе сделать запись нечитаемых агрументов в файле (названия файла, кодирование, некоторые другие параметры)... но если открыть файл просто так, то он прочитает весь текст! Поэтому нужно записать данные не текстовоЮ, а бинарно, и потом прочитать их из файла.
Вопрос - как это реализовать в Free Pascal?
ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
|
|
| |
GECK | Дата: Четверг, 13 Декабря 2012, 07:45 | Сообщение # 2 |
заслуженный участник
Сейчас нет на сайте
| Функции BlockWrite/BlockRead, например.
Всё гениальное просто. И хреново работает.
|
|
| |
Andrey_M | Дата: Четверг, 13 Декабря 2012, 12:59 | Сообщение # 3 |
старожил
Сейчас нет на сайте
| Поподробнее можно?
ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
|
|
| |
uberchel | Дата: Суббота, 15 Декабря 2012, 13:53 | Сообщение # 4 |
частый гость
Сейчас нет на сайте
| Есть много вариантов, вообще для такого дела нужно использовать потоки. Покажу простой и конечно не быстрый вариант, для больших файлов не подходит:
Code function StrToHex(S: String): String; var I: Integer; begin Result:= ''; for I := 1 to length (S) do Result:= Result+IntToHex(ord(S[i]),2); end;
// скоро тут что нибудь появится )
|
|
| |
Andrey_M | Дата: Суббота, 15 Декабря 2012, 16:26 | Сообщение # 5 |
старожил
Сейчас нет на сайте
| Спасибо!
А чтение оттуда как сделать?
ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
|
|
| |
TimKruz | Дата: Понедельник, 17 Декабря 2012, 19:55 | Сообщение # 6 |
старожил
Сейчас нет на сайте
| Quote (uberchel) Result:= ''; for I := 1 to length (S) do Result:= Result+IntToHex(ord(S[i]),2); Нельзя считать значение result, в него только записывать можно (потому что это не переменная). Да и вообще, зачем тут шестнадцатеричное представление чисел? Andrey_M хочет писать в файл помимо текста управляющую информацию.
Andrey_M, можно, например, в начале файла записывать нужные переменные (типа первый байт=N - длина названия, далее N байт названия и т.д.), которые будут считываться редактором, но не отображаться на экране. Или вставлять управляющие символы, или вообще тегами делать (получится типа xml, т.е. куча лишних байт, но читабельно, если открыть простым "блокнотом"). А для преобразования символов в "бинарный формат" можно использовать ord(x:char):byte, возвращающий код символа, и chr(x:byte):char, возвращающий символ по коду. Т.е. ord(' ')=32 (код пробела = 32) и chr(32)=' '. Открывать файлы можешь как текст, а можешь как нетипизированный файл (var f:file;). В нетипизированном файле read/ln и write/ln не работают, нужно использовать blockread/blockwrite. Ну или использовать типизированный файл (используются только read и write) байт или слов (2 байта), как тебе будет удобнее.
Quote (Andrey_M) Поэтому нужно записать данные не текстовоЮ, а бинарно, и потом прочитать их из файла. "Бинарный" файл можно открыть как "текстовый" и прочитать его содержимое как текст. И наоборот, "текстовый" - как "бинарный" и прочитать числа или структурированные данные. Все эти названия ("текстовый", "бинарный", "структурированный", "ещё какая-то фигня") условны и используются человеком только для определения типа содержимого конкретного файла. На диске файл хранится в виде последовательности байт. Буквы и вообще символы кодируются одним (или двумя в расширенных кодировках) байтом, т.е. каждый символ соответствует какому-то определённому числу, а текстовый редактор, открывая файл, отображает на экране символы, соответствующие числам-кодам в файле.
P.S. Скачай НОРМАЛЬНУЮ книгу-учебник по TurboPascal и прочитай внимательно от корки до корки, пробуя на практике каждую новую для тебя функцию. Тогда большинство твоих "нубских" вопросов отпадут.
|
|
| |
Andrey_M | Дата: Понедельник, 17 Декабря 2012, 20:01 | Сообщение # 7 |
старожил
Сейчас нет на сайте
| Quote (TimKruz) по TurboPascal Я на фри работаю.ъ
ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
|
|
| |
Rean | Дата: Понедельник, 17 Декабря 2012, 20:04 | Сообщение # 8 |
участник
Сейчас нет на сайте
| Quote (Andrey_M) Я на фри работаю Не имеет значения.
Сообщение отредактировал Rean - Понедельник, 17 Декабря 2012, 20:04 |
|
| |
Andrey_M | Дата: Понедельник, 17 Декабря 2012, 22:39 | Сообщение # 9 |
старожил
Сейчас нет на сайте
| Quote (Rean) Не имеет значения. Как я помню, разница всё же есть.ъ
ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
|
|
| |
TimKruz | Дата: Вторник, 18 Декабря 2012, 21:57 | Сообщение # 10 |
старожил
Сейчас нет на сайте
| Quote (Andrey_M) Как я помню, разница всё же есть. Ты сначала внимательно изучи и освой на практике все основы Pascal, которые для TP и FP одни и те же, да и для Delphi с Lazarus, ну и вообще научись алгоритмы писать. А различия между FP и другими диалектами как-нибудь потом изучишь, если это тебе вообще понадобится...
|
|
| |
Andrey_M | Дата: Среда, 19 Декабря 2012, 09:17 | Сообщение # 11 |
старожил
Сейчас нет на сайте
| Quote (TimKruz) Ты сначала внимательно изучи и освой на практике все основы Pascal, которые для TP и FP одни и те же, да и для Delphi с Lazarus, ну и вообще научись алгоритмы писать. А различия между FP и другими диалектами как-нибудь потом изучишь, если это тебе вообще понадобится... Сейчас почти все учебники по Free Pascal совмещены с учебниками по Lasarus... причём в тех, которые мне попадались, акцент на последний язык и его тупой графический интерфейс.
ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
|
|
| |