Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.23;
Скачать: CL | DM;

Вниз

как правильно прочитать данные   Найти похожие ветки 

 
Андрусь ©   (2003-01-14 13:15) [0]

Привет Всем! ВОт такая у меня проблемка:читаю из файла n байт(n<4),которые можно интерпретировать как длину,в переменную типа DWord.Порядок байт в файле 00 01 02 03 (ст. байт идёт первым),а в переменной получается наоборот 03 02 01 00. Я,не мудрствуя лукаво сделал,как мне было проще:

var r,r1,i:Cardinal;F:TFileStream;
begin
F:=TFileStream.Create(File_In,fmOpenRead);
r:=0;
For i:=1 To n Do
Begin
r1:=0;
F.Read(r1,1);
r1:=r1 shl (8*(n-i));
r:=r1+r;
End;
F.Free;
end;

Уверен,что можно сделать тоже,но с меньшим расходом ресурсов. Зараннее всем благодарен.


 
Skier ©   (2003-01-14 13:20) [1]

Прочитал всё в массив байт и потом Move().
Не спасёт ?


 
Андрусь ©   (2003-01-14 16:08) [2]

Спасибо,это уже получше.Токмо как прочитать в обратном порядке. Очень не хочется делать лишние движения.
s:Array[1..4] Of Byte;
F.Read(s,2);Получаем в s теже 03 02 01 00. Нужно дополнительно делать перегон массива.


 
icWasya ©   (2003-01-14 16:37) [3]

совсем просто

var r:Cardinal;

F.Read(r,4);

asm
BSWAP r;
end;


 
Андрусь ©   (2003-01-14 16:42) [4]

в дельфяге тоже есть такая ф-я,но к словам.


 
TTCustomDelphiMaster ©   (2003-01-14 16:49) [5]


> Порядок байт в файле 00 01 02 03 (ст. байт идёт первым),а
> в переменной получается наоборот 03 02 01 00.

Так и должно быть. При записи в память сначала пишуться младшие байт(ы) а потом старшие(если смотреть "справа налево"). Люди же привыкли писать сначала старшие разряды, а затем младшие.
Так что число записанное в файле вполне соответствует полученному вами в Hex формате. Поменяв байты местами вы получите не то число, которое сохранили в файле. Или же запись в файл сделана некоректно т.е. вы пишите туда не то что вам нужно.


 
Андрусь ©   (2003-01-14 17:18) [6]

в том то и дело,что файл пишется по другому принципу, а мне его разбирать


 
NDeu ©   (2003-01-14 17:31) [7]

Попробуй:
var r:record
case integer of
1:(C:cardinal);
2:(B:array[0..3]of Byte);
end;

Заполняй r.B[i] начиная с i:=3 downto 0
В r.C дольжно получится то что нужно



Страницы: 1 вся ветка

Текущий архив: 2003.01.23;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.019 c
7-72545
DimaK
2002-11-11 00:14
2003.01.23
Помогите разобраться с изменением разрешения экрана


7-72568
zsv
2002-11-13 05:26
2003.01.23
Как узнать версию Windows


3-72091
Stenkz
2002-12-29 13:06
2003.01.23
Как задать пароль базы данных Interbase?


14-72497
Dr.Sergey
2003-01-01 14:05
2003.01.23
Подскажите пожалуйста


1-72219
TAN
2003-01-14 12:12
2003.01.23
ShellExecute