![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите раскрыть двоичный файл [D7, XP]
Rus © (2008-03-26 17:08:00)В описании файла написано:
смещение длина поле
0 3 Дата данных (месяц:день:год)
3 2 Время данных (часы:минуты)
5 4 Расход
9 4 Р2
13 4 Р3
17 4 Р4
21 4 Р5
25 4 Р6
29 4 Р7
33 4 Р8
Все измеряемые величины представлены в формате с плавающей точкой одинарной точности (float).
Все это лежит в файле Hh02011.083 (там одна строка за 17/03/08)
Я читаю файл:
procedure TForm1.Button2Click(Sender: TObject);
begin
fs := TFileStream.Create(ExtractFilePath(Application.ExeName)+'\HCon\'+'Hd02011.083', fmOpenRead);
RichEdit1.Clear;
try
RecNum := fs.Size div SizeOf(TMyRec);
while RecNum > 0 do
begin
fs.ReadBuffer(MyRec, SizeOf(TMyRec));
// ...
//Дата
ShowMessage(FloatToStr(Myrec.MyDate[0]));получено 3 (3-й месяц)
ShowMessage(FloatToStr(Myrec.MyDate[1]));получено 17 (17-е число)
ShowMessage(FloatToStr(Myrec.MyDate[2]));получено 8 (2008 год)
//Время
ShowMessage(IntToStr(Myrec.MyTime[0]));получено 0 (0 часов)
ShowMessage(IntToStr(Myrec.MyTime[1]));получено 0 (0 минут)
//Расход
ShowMessage(FloatToStr(Myrec.Rashod[0])); 94,336.......
ShowMessage(FloatToStr(Myrec.Rashod[1]));93,067...
ShowMessage(FloatToStr(Myrec.Rashod[2]));1,322....
ShowMessage(FloatToStr(Myrec.Rashod[3]));215,97....
...
...
...
Если с датами получилось, то с расходом что-то не понятное.
Как из этих четырех значений получить одно...
Объясните пожалуста, сделав скидку, что с двоичными файлами ни когда не работал, как получить истинное значение.
Выручайте, кто может ...
Anatoly Podgoretsky (2008-03-26 21:32:00) [1]> Rus (26.03.2008 17:20:03) [3]
А измеряемых величин 8, а не 4
Германн (2008-03-26 19:09:00) [2]
> Kolan © (26.03.08 17:58) [8]
>
> PS
> формат даты наводит дрож :) Интересно что длать с 1998 годом…
>
Обычный формат для микросхем RTC.
Этот ещё ничего. А есть такие микросхемы, где год задан числом от 0 до 3.
Kolan (2008-03-26 18:06:00) [3]> а зачем лишняя переменная?
Старый код (года два ему точно), когда-то написал с подсказки (как бы не тебя :) ) Знаю что можно, но переписывать нехочу
Да и функцией надо сделать
Palladin (2008-03-26 18:00:00) [4]а зачем лишняя переменная?
procedure ConvertBytesToFloat(HighByte1, HighByte2,
LowByte1, LowByte2: Byte; var Value: Single);
var
TempArr: array[0..3] of Byte absolute Value;
begin
TempArr[0] := HighByte1;
TempArr[1] := HighByte2;
TempArr[2] := LowByte1;
TempArr[3] := LowByte2;
end;
да и вообще одним singlом обойтись можно...
Kolan (2008-03-26 17:58:00) [5]PS
формат даты наводит дрож :) Интересно что длать с 1998 годом
Kolan (2008-03-26 17:56:00) [6]> array[0?] of Byte
array[0..3] of Byte
Rus (2008-03-26 17:53:00) [7]Спасибо Kolan Работает!
Сергей М. (2008-03-26 17:24:00) [8]
> Rus
Приведи содержимое двойного слова, находящегося в поле Расход в hex-формате, соответствующее ему реальноеfloat-значение и значение, полученное тобой
Kolan (2008-03-26 17:24:00) [9]
procedure ConvertBytesToFloat(HighByte1, HighByte2,
LowByte1, LowByte2: Byte; var Value: Single);
var
TempArr: array[0Ե] of Byte;
TemVal: Single absolute TempArr;
begin
TemVal := 0;
TempArr[0] := HighByte1;
TempArr[1] := HighByte2;
TempArr[2] := LowByte1;
TempArr[3] := LowByte2;
Value := TemVal;
end;
?
Rus (2008-03-26 17:20:00) [10]TMyRec = packed record
MyDate: array[0..2] of Byte;
MyTime: array[0..1] of Byte;
Rashod: array[0..3] of Single;
Palladin (2008-03-26 17:15:00) [11]описание TMyRec мы, конечно, все и так прекрасно знаем...
Сергей М. (2008-03-26 17:13:00) [12]
> с плавающей точкой одинарной точности
Предположу, что соотв.поля в твоей структуре д.б. объявлены как single