![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как превратить файл в строку? [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)
Читаете файл побайтно, значение каждого байта преобразуете в шестнадцатеричное представление и прибавляете к строке. Кстати, лучше всё же заранее установить длину строки (на основании размера файла) и просто работать с её символами, чтобы каждый раз не перераспределять память.
А теперь задавайте конкретный вопрос :-)