Главная страница
    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.041 c
3-1107157872
Mva
2005-01-31 10:51
2005.02.27
Вставка записи


14-1107851672
Ega23
2005-02-08 11:34
2005.02.27
Кто уже получил счёт за "коммуналку"?


4-1105700892
Net
2005-01-14 14:08
2005.02.27
Свернуть приложение...


9-1101917465
MrAngel
2004-12-01 19:11
2005.02.27
Восстановление окна после полно-экранного режима.


14-1107978650
Mike Kouzmine
2005-02-09 22:50
2005.02.27
Какой генератор отчетов сегодня используют умные люди?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский