Форум: "Основная";
Текущий архив: 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