Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как превратить файл в строку? [D7, WinXP]


Sphinxx ©   (2005-02-09 19:21:00) 

Например есть какой-то файл, его нужно преобразовать в строку, при чем каждый байт будет в шестнадцатиричном виде?
например "FF30FD66C4" и т.д.
Есть у кого-нибудь решение такой задачи в виде функции например?


begin...end   (2005-02-10 08:42:00) [1]

> Fay ©   (09.02.05 20:24) [9]

> Честно? Length('30') = ?

Честно. Length('30') = 2, да только к вопросу автора это никакого отношения не имеет.

Вопрос-то был вот каким: есть какой-то файл, его нужно преобразовать в строку, при чем каждый байт будет в шестнадцатиричном виде.

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


Fay   (2005-02-09 20:37:00) [2]

2 Юрий Зотов ©   (09.02.05 20:33) [11]
Возможно, я не правильно понял вопрос. А м.б. и нет.


Юрий Зотов   (2005-02-09 20:33:00) [3]

> Fay ©   (09.02.05 19:42) [3]

Японский тоже. Справочку по совместимости целочисленных типов и IntToHex посмотрите, пожалуйста.

> Fay ©   (09.02.05 19:51) [6]

> Если в файле содержится именно "строка"
В файле содержится что угодно.

> вида 'FF30FD66C4'
Это вид результатат, а не содержимого файла.

> (а это следует из вопроса),
Не следует. Hex-редакторы видели?

> то считывать надо по 2 байта и преобразовавать их к одному.
Ровно наоборот - каждый считанный байт преобразуется в два. Можно считывать и по несколько байт, но тогда придется учитывать их перестановку. Для задавшего вопрос это будет явно сложновато.


sniknik   (2005-02-09 20:27:00) [4]

> Что значит '30' -> '0'? '30' - это ведь и есть один байт.
буквально понимай, если строка (как в вопросе) то она уже в шестнадцатиричном виде, а значит преобразовывать надо к символам (в строку).
т.е. "30" там, это 48 в десятичном, и это символ нуля "0".


Fay   (2005-02-09 20:24:00) [5]

2 begin...end ©   (09.02.05 20:06) [8]
Честно? Length('30') = ?


begin...end   (2005-02-09 20:06:00) [6]

> Fay ©   (09.02.05 19:51) [6]

Хм, а сейчас я вообще перестал Вас понимать :-)

Что значит '30' -> '0'? '30' - это ведь и есть один байт.


begin...end   (2005-02-09 19:56:00) [7]

> Fay ©   (09.02.05 19:51) [6]

Ну, в вопросе это приведено для примера... А в случае нчётного количества байт считывать по 2, конечно, можно, но это несколько усложнит код.

В общем, выкладываю свои 2 варианта (с чтением по одному байту):

1. С прибавлением к строке:

var
 F: file of Byte;
 B: Byte;
 S: String;
begin
 AssignFile(F, 'E:\1.txt');
 Reset(F);
 while not EOF(F) do
 begin
   Read(F, B);
   S := S + IntToHex(B, 2);
 end;
 CloseFile(F)
end


2. С предварительной установкой длины строки (подойдёт для больших файлов):

var
 F: file of Byte;
 I: Integer;
 B: Byte;
 sB, S: String;
begin
 AssignFile(F, 'E:\1.txt');
 Reset(F);
 SetLength(S, FileSize(F) * 2);
 I := 1;
 while not EOF(F) do
 begin
   Read(F, B);
   sB := IntToHex(B, 2);
   S[I] := sB[1];
   S[I + 1] := sB[2];
   Inc(I, 2)
 end;
 CloseFile(F)
end


Fay   (2005-02-09 19:51:00) [8]

Если в файле содержится именно "строка" вида 'FF30FD66C4' (а это следует из вопроса), то считывать надо по 2 байта и преобразовавать их к одному. Типа '30' -> '0'.


begin...end   (2005-02-09 19:45:00) [9]

> Fay ©   (09.02.05 19:42) [3]

> Int ?!

А что Вы имеете против?


palva   (2005-02-09 19:45:00) [10]

Fay ©   (09.02.05 19:42) [3]
Так и не понял юмора. Наверняка что-нибудь не в порядке, но я не вижу что.


Fay   (2005-02-09 19:42:00) [11]

>> считать 1 байт файла (Read)
1 ?
>> - преобразовать его в строковое представление (IntToHex)
Int ?!

Китайский Новый год удался 8)


Юрий Зотов   (2005-02-09 19:28:00) [12]

Что мешает:
- считать 1 байт файла (Read)
- преобразовать его в строковое представление (IntToHex)
- сцепить со строкой-результатом (+)
И так -  в цикле, пока не кончится файл (EoF).

Неужели эти десять-пятнадцать строчек так уж сложны?


begin...end   (2005-02-09 19:27:00) [13]

> Sphinxx ©   (09.02.05 19:21)

Читаете файл побайтно, значение каждого байта преобразуете в шестнадцатеричное представление и прибавляете к строке. Кстати, лучше всё же заранее установить длину строки (на основании размера файла) и просто работать с её символами, чтобы каждый раз не перераспределять память.

А теперь задавайте конкретный вопрос :-)


Наверх

Титульная страница Поиск, карта сайта Написать письмо