Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.04 c
4-1105716722
Scained
2005-01-14 18:32
2005.02.27
Если пример как на D6 записать свой код в PE-EXE файл


3-1107239879
ocean
2005-02-01 09:37
2005.02.27
Как корректно создать DBF?


14-1107722684
wl
2005-02-06 23:44
2005.02.27
Российская гуманитарная помощь


3-1106940759
UVV
2005-01-28 22:32
2005.02.27
dbExpress бесплатные компоненты или нет?


1-1108050696
miwa
2005-02-10 18:51
2005.02.27
Есть ли штатная возможность расширения выпадающей части ТListBox?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский