Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.27;
Скачать: CL | DM;

Вниз

Как превратить файл в строку?   Найти похожие ветки 

 
Sphinxx ©   (2005-02-09 19:21) [0]

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


 
begin...end ©   (2005-02-09 19:27) [1]

> Sphinxx ©   (09.02.05 19:21)

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

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


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

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

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


 
Fay ©   (2005-02-09 19:42) [3]

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

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


 
begin...end ©   (2005-02-09 19:45) [4]

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

> Int ?!

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


 
palva ©   (2005-02-09 19:45) [5]

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


 
Fay ©   (2005-02-09 19:51) [6]

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


 
begin...end ©   (2005-02-09 19:56) [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


 
begin...end ©   (2005-02-09 20:06) [8]

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

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

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


 
Fay ©   (2005-02-09 20:24) [9]

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


 
sniknik ©   (2005-02-09 20:27) [10]

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


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

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

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

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

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

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

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

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


 
Fay ©   (2005-02-09 20:37) [12]

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


 
begin...end ©   (2005-02-10 08:42) [13]

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

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

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2005.02.27;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.043 c
14-1107430457
r.o.o.t
2005-02-03 14:34
2005.02.27
ОПРОС ПРОГРАММЕРОВ


3-1107136265
mlitkin
2005-01-31 04:51
2005.02.27
Как узнать была ли изменена база?


3-1106732533
}|{yk
2005-01-26 12:42
2005.02.27
Как сделать выборку по главной таблице


6-1103702105
BJValentine
2004-12-22 10:55
2005.02.27
Свободное дисковое пространство на удаленном компе


14-1107188457
Piter
2005-01-31 19:20
2005.02.27
Клиент для чата Delphimaster.ru