Главная страница
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.039 c
14-1107772373
Ivan Shikhalev
2005-02-07 13:32
2005.02.27
Кто-нибудь видел Hi Asm?


1-1108459051
Игорь нтк
2005-02-15 12:17
2005.02.27
неактивная кнопка


9-1101893653
Вась-Вась
2004-12-01 12:34
2005.02.27
Изометрия


1-1108022785
O.O
2005-02-10 11:06
2005.02.27
Смена шрифтов


9-1101067334
некто
2004-11-21 23:02
2005.02.27
Солнце