Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
1 / 1 / 0
Регистрация: 23.08.2013
Сообщений: 41
Записей в блоге: 1

О дешифровке приборного файла

20.10.2023, 13:26. Показов 2682. Ответов 70
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, плиз, относительно дешифровки приборного файла.

Запрос авторам данных сделал, но там сложное положение: одни уволились, другие сами не понимают что и как - так что могут так и не ответить... долго объяснять всю ситуацию, всё довольно запутано...

..........................
Описание формата файла (от авторов):

Все данные пишутся в файл в бинарной форме. Вначале идет заголовок длинной в 1600 байт. Сразу после заголовка (после 1600 байт) непрерывно пишутся сами данные в виде последовательности из 2-байтных целых чисел.

Формат заголовка данных
ТипРазмер (байт)Описание
short2Число записей
float4Средний скачок между цифрами
shor2Минимум
shor2Максимум
char80Название канала

и т.д. ...
.....................

Вопрос в следующем:

я читаю файл, например, как

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Var
jWord  :  Word;
fI  :  File of Word;
...
 
Begin
...
 
While NOT(EOF(fI)) do
begin
  Кead(fI,jWord);
  Write(fF,IntToStr(jWord)+', ');
end;  //  While NOT(EOF(f))...
...
получаю такое:

3736, 0, 0, 65163, 374, 0, 57047, 16383, 250, 8240,27424, 24864, 44320, 24864, 43808, 8224, 8320, 8342, 8335, 0,...
- начало заголовка (1600 байт) и

65528, 65528, 65526, 65527, 65528, 65528, 65529, 65529, 65529, 65528,65527, 65529, 65529, 65528, 65528, 65528, 65528, 65528, 65529, 65528,...
- для собственно данных.

1.
Так вот - как мне дешифровать в десятичную цифру, "float 4 Средний скачок"?
как дешифровать "char 80 Название канала" в строку и прочие НЕ Word переменные в их формат?

Я же имею прочитанные Word, т.е. float в моей выдаче выглядит, как "57047, 16383", да и char и прочее - не лучше.

Тут я и останавливаюсь, т.к. не понимаю - как дешифровывать НЕ 2-х байтные переменные в переменные, состоящие из ДРУГОГО числа байт.

2.
Также, т.к., думаю, запись собственно приборных данных достаточно единообразна у всех - поэтому подскажите какую-нибудь мысль, относительно того, что собственно данные имеют такой вид, как - см. выше - на верхнем пределе 2-х байт.
Мах/мин в Заголовке коррелируют с прочитанными значениями. Мах= 374, мин= 65163, т.е какая-то мелкая фигня с переполнением. Но какая?
(Как уже писал - авторы, пока, в несознанке и не просвещают меня)

Файл я читаю, скорее правильно, т.к. в заголовке есть день-месяц-год и эти три Word числа правильны.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.10.2023, 13:26
Ответы с готовыми решениями:

Перекрёстный запрос: общее состояние приборного парка
Суть проблемы. Во вложении кусок БД. Есть запрос и по нему форма "общее состояние приборного парка". Запрос считает сколько...

К дешифровке
Здравствуйте! Можете помочь расшифровать и объяснить как расшифровали. 1)...

InvMixColumns в дешифровке AES
Застрял(туплю). Помощь. В функции MixColumns все было как бы просто, значения только 1,2, и 3, при умножении на 2 где-то прочитал, что...

70
 Аватар для Beltar
1071 / 512 / 41
Регистрация: 05.05.2022
Сообщений: 3,599
24.10.2023, 11:15
Студворк — интернет-сервис помощи студентам
Я для чего спрашиваю возможные значения данных?
Переставить байты, если там Big Endian несложно, а в HeX-редакторе можно смотреть значения в любом формате.
0
1 / 1 / 0
Регистрация: 23.08.2013
Сообщений: 41
Записей в блоге: 1
24.10.2023, 12:36  [ТС]
Cyborg Drone спасибо за Абсолют. М.б. ... м.б.

---------------

ребята, у нас какой-то миссандестендинг...

Моя ситуация такова.

Есть туева хуча данных во многих файлах. Данные представляют из себя измерения каждые 2 секунды на протяжении около 3 лет в 5 каналах.

Я думаю, вы согласитесь, что ковырять их вручную редактором - даже мысль такая несколько напрягает...

Я не программист, а пользуюсь компом для РАСЧЁТОВ и АНАЛИЗА данных, т.е. комп - это мои карандаш и бумага. Тонкости не изучал, поэтому и спрашиваю: "возможно ли"? и если возможно: то "как"?

В связи с вышесказанным - я и интересуюсь знать: существует ли какая ТАБЛЕТКА для программной разблюдовки, скажем, прочитанного байтового массива, по моему желанию - в 2- байтовые конструкции, 4-х байтовые? И не одного числа, а упомянутых миллионов чисел.

То, что можно расхреначить каждый байт в биты и руками собирать их: из 4-х: Real, из 2-х: Word - это да. Но это такой геммор! Что, м.б., овчинка не стоит выделки... к сожалению.

Так что, благодарю всех выступивших, но, видимо, таблетки нет и надо придумывать что-то другое...
0
 Аватар для Beltar
1071 / 512 / 41
Регистрация: 05.05.2022
Сообщений: 3,599
24.10.2023, 13:21
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
TWord=record
case Byte of
0:(W:Word);
1(b1:Byte; b2:Byte);
end;
 
var W:TWord;
  b:Byte;
begin
W.W:=$ABCD;//В 16-теричном виде это 43981
b:=W.b1;
W.B1:=W.b2;
W.b2:=b;
//Теперь W.W=CDAB;//Или 52651
end
 
//Это простейший способ разметки данных на уровне байтов
//Если делать нефиг, то можно указатель на байт объявить
//И просто ходить по памяти. В Си на этом все построено.
// Но сесть при этом можно на такой гвоздь
//Что задница потом неделю болеть будет
//Из реального проекта более сложный случай
type
TI500AI=packed array[1..8] of Single;
//packed чтобы устранить автовыравнивание
TI500ReadAIsResponse=packed record
    case Byte of
    0:(
      Number:Byte;
      Command:Byte;
      ReadBytes:Byte;
      Value:TI500AI;
      CRCLO:Byte;
      CRCHi:Byte;
      );
    1:(Bytes:array[0..36] of Byte);
  end;
 
//Тут приходящий с оборудования массив из 37 байтов накладывается на структуру с полями из байтов и массива Single
Вам же сказали, что читать заголовок надо сразу в структуру. И ничего переставлять не понадобится. Вам поэтому не говорят, как это сделать, т. к. это ненужно. Подобная перестановка потребуется если там данные в Big Endian, т. е. в обратном порядке байты, тогда их можно сначала считать в массив структур типа TWord, а потом переставить таким макаром байты.

Добавлено через 12 минут
Работа с памятью

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var p:^Byte;
  W:Word;
  b1,b2:Byte;
 
begin
p:=@W;
b1:=(p^);//Первый байт W;
Inc(p);
//Операция Inc применительно к указателю
//увеличивает его значение на размер типа, на который указывает
//В данном случае на 1.
//p:=p+1; тоже возможно, с Delphi 2009 если включена директива $PointerMath
//В более ранних версиях это делалось, через приведение pointer к целому Integer(p):=Integer(p)+1;
b2:=(p^);//Второй байт W.
end;
//Но если ошибетесь, то просто не будете понимать, где ошибка
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,495
24.10.2023, 15:01
Лучший ответ Сообщение было отмечено ygy как решение

Решение

Цитата Сообщение от ygy Посмотреть сообщение
ребята, у нас какой-то миссандестендинг...
Скорее, у вас миссандестендинг. Уже несколько раз написали и даже показали, как считать тот же заголовок. Там видно, что ничего не надо конвертировать 2 в 4 байта и т.д.

Цитата Сообщение от ygy Посмотреть сообщение
по моему желанию - в 2- байтовые конструкции, 4-х байтовые
Надо делать не по желанию, а в соответствии с форматом хранения в файле.

Цитата Сообщение от ygy Посмотреть сообщение
мин= 65163, т.е какая-то мелкая фигня с переполнением. Но какая?
Это не переполнение, а отрицательные числа.

Вот чтение заголовка и данных:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
const
  CHBUF_SIZE =   80;
  HDR_SIZE   = 1600;
 
type
  int16 = smallint;
  TCharBuf = array[0..CHBUF_SIZE - 1] of AnsiChar;
  PHeaderItem = ^THeaderItem; // указатель
  THeaderItem = packed record
    RecCount:    int16;     // short 2 Число записей
    AverJmp:     single;    // float 4 Средний скачек между цифрами
    Min:         int16;     // shor 2 Минимум
    Max:         int16;     // shor 2 Максимум
    WTF_0:       int16;     // shor 2 0.32 соответствует
    SampPrd:     single;    // float 4 Период дисретизации
    LastPtCount: int16;     // short 2 Число точек в последней записи
    ChannelName: TCharBuf;  // char 80 Название канала
    TimeStart:   single;    // float 4 Время начала
    TimeStop:    single;    // float 4 Время конца
    Day:         int16;     // short 2 День начала
    WTF_1:       int16;     // short 2 ???????????????
    WTF_2:       int16;     // short 2 ???????????????
    WTF_3:       int16;     // short 2 ???????????????
    Month:       int16;     // short 2 Месяц начала
    Year:        int16;     // short 2 Год начала
    WTF_80:      TCharBuf;  // char 80
  end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
var
  hdr: THeaderItem;
  fs: TFileStream;
  sName: TCharBuf;
  v: SmallInt;
  rb, i: integer;
begin
  if OpenDialog1.Execute then
  begin
    Memo1.Lines.Clear;
    Memo1.ScrollBars := ssVertical;
    fs := TFileStream.Create(OpenDialog1.FileName, fmOpenRead or fmShareDenyNone);
    fs.Read(hdr, SizeOf(hdr));
    // Теперь можно прочитать данные из записи hdr
    Memo1.Lines.Add(Format('Rec count: %d', [hdr.RecCount]));
    Memo1.Lines.Add(Format('Average jump: %f', [hdr.AverJmp]));
    Memo1.Lines.Add(Format('Min: %d', [hdr.Min]));
    Memo1.Lines.Add(Format('Max: %d', [hdr.Max]));
    Memo1.Lines.Add(Format('Неизвестно 1: %d', [hdr.WTF_0]));
    Memo1.Lines.Add(Format('Sample period: %f', [hdr.SampPrd]));
    Memo1.Lines.Add(Format('Число точек в последней записи: %d', [hdr.LastPtCount]));
    OemToChar(hdr.ChannelName, sName);
    Memo1.Lines.Add(Format('Название канала: %s', [sName]));
    Memo1.Lines.Add(Format('Время начала: %s', [TimeToStr(hdr.TimeStart)]));
    Memo1.Lines.Add(Format('Время окончания: %s', [TimeToStr(hdr.TimeStop)]));
    Memo1.Lines.Add(Format('День начала: %d', [hdr.Day]));
    Memo1.Lines.Add(Format('Неизвестно 2: %d', [hdr.WTF_1]));
    Memo1.Lines.Add(Format('Неизвестно 3: %d', [hdr.WTF_2]));
    Memo1.Lines.Add(Format('Неизвестно 4: %d', [hdr.WTF_3]));
    Memo1.Lines.Add(Format('Месяц начала: %d', [hdr.Month]));
    Memo1.Lines.Add(Format('Год начала: %d', [hdr.Year]));
    OemToChar(hdr.WTF_80, sName);
    Memo1.Lines.Add(Format('Неизвестно 5: %s', [sName]));
    // И т.д.
    fs.Seek(1600, 0);
    // Дальше читать так же
    Memo1.Lines.BeginUpdate;
 
    for i := 0 to 99 do begin
      rb := fs.Read(v, SizeOf(v));
      Memo1.Lines.Add(IntToStr(v));
    end;
 
//    repeat
//      rb := fs.Read(v, SizeOf(v));
//      Memo1.Lines.Add(IntToStr(v));
//    until rb < SizeOf(v);
 
    Memo1.Lines.EndUpdate;
  //   ...
 
 
    FreeAndNil(fs);
  end;
end;
Результат чтения заголовка и первых 100 значений данных
Rec count: 3736
Average jump: 0,00
Min: -373
Max: 374
Неизвестно 1: 0
Sample period: 2,00
Число точек в последней записи: 250
Название канала: 0 k a н a л А Ц П
Время начала: 0:00:00
Время окончания: 12:00:00
День начала: 27
Неизвестно 2: 0
Неизвестно 3: 0
Неизвестно 4: 0
Месяц начала: 3
Год начала: 8
Неизвестно 5: seism
-6
-8
-8
-9
-7
-7
-7
-8
16
-2
-8
-7
-5
-8
-9
-6
-9
-8
-10
-7
-7
-3
-9
-7
-4
-7
-7
-4
-8
-4
-7
-9
-5
-4
-4
-6
-7
-10
-8
-10
-9
-8
-10
-9
-8
-7
-8
-9
2
0
-11
-4
-5
-5
-12
-11
2
2
-5
-3
-2
-6
-11
-11
-3
-8
-7
-8
-10
10
-16
-6
3
-14
-7
-3
-12
-2
-14
-10
-6
-11
-4
-9
-3
-6
-9
-6
-4
4
-1
-7
-3
-3
-5
-5
2
-6
-5
-7
1
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
25.10.2023, 01:22
А собственно какая конечная цель у ТС? Ну вот прочитал он заголовок и данные, а дальше что? Их надо куда то отобразить? В каком виде? Как при этом будут использованы данные из заголовка?
Несколько лет назад была тоже тема с чтением данных бакенов, там тоже примерно все так начиналось, а в итоге вышло целое приложение для работы с файлами измерений.
0
пофигист широкого профиля
4770 / 3206 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
25.10.2023, 01:29
Цитата Сообщение от ygy Посмотреть сообщение
Я не программист, а пользуюсь компом для РАСЧЁТОВ и АНАЛИЗА данных, т.е. комп - это мои карандаш и бумага.
Цитата Сообщение от ygy Посмотреть сообщение
В связи с вышесказанным - я и интересуюсь знать: существует ли какая ТАБЛЕТКА для программной разблюдовки, скажем, прочитанного байтового массива, по моему желанию - в 2- байтовые конструкции, 4-х байтовые? И не одного числа, а упомянутых миллионов чисел.
Не существует универсальной таблетки на несколько миллионов вариантов!
0
274 / 206 / 30
Регистрация: 26.11.2022
Сообщений: 887
25.10.2023, 11:49
универсальная таблетка - numpy , scipy , Matplotlib , Tkinter +все возможности быстрого прототипирования на питоне.
только таблетка токсичная немного - требуется иммунитет в виде довольно обширных познаний. но потом можно любые анализы данных щелкать как семечки ))
Я бы даже сказал что это типовой путь ))
0
1 / 1 / 0
Регистрация: 23.08.2013
Сообщений: 41
Записей в блоге: 1
25.10.2023, 12:18  [ТС]
Beltar
спасибо за текст, но мне это менее понятно, чем у AzAtom.


AzAtom
огромное спасибо. В Вас есть преподавательское умение. Дообъяснили.

Использовал Ваш код. Всё работает. Особенно важно, что smallint, а то я упёрся в Word...

Правда не работает OemToChar(hdr.WTF_80, sName);
("несовместимые типы "PWideChar" и "TCharBuf"")
Но это не принципиально - название файла даёт нужное.

С ПРОГРАММНОЙ (.) зрения - файлы прочитаны.
Но в смысловом смысле - пока мало что понимаю - нет соответствия ожиданий и действительности. К счастью проявили некоторую активность авторы - мало, ПОКА что стало ясно, но, хотя бы, разрешилась "чрезвычайно волнительная загадка" поля "0.32 соответствует" - видимо - (на 90%), это точность измерений в мкм.

Пытливый
мне эти данные нужны для дальнейшего анализа/ корреляций с другими явлениями в области, в общем, чистейшей, я бы сказал, дистиллированной - физики.
Возможно, также, в дальнейшем, это в чём-то поможет прогнозу ОБЩЕГО уровня сейсмичности.

Aledveu
Питона немного за хвост дёргал - нет, не моё... хотя вещь забавная...
Я привык думать по ФОРТРАНУ...
Так что: Дельфи + EXCL + "всё, что потребуется впредь".


ИТАК, ещё раз спасибо всем: "Дальше - сам..."
Миниатюры
О дешифровке приборного файла  
0
 Аватар для Beltar
1071 / 512 / 41
Регистрация: 05.05.2022
Сообщений: 3,599
25.10.2023, 13:27
Цитата Сообщение от ygy Посмотреть сообщение
Правда не работает OemToChar(hdr.WTF_80, sName);
И не должно, т. к. она ожидает юникодовый тип строки, а в буфере ANSIChar однобайтовый.

Возможно, что прокатит явное преобразование OemToChar("PWideChar(hdr.WTF_80), sName)

Цитата Сообщение от ygy Посмотреть сообщение
но мне это менее понятно, чем у AzAtom
Вы просили, я вам показал, хотя этого не требовалось. В принципе перестановка могла понадобится, если бы там был Big Endian. Вообще 2 байта можно трактовать 4 способами: знаковое целое, беззнаковое целое, и то же самое в обратном порядке. Считать мало, надо знать, что читается.

мне эти данные нужны для дальнейшего анализа/ корреляций с другими явлениями в области, в общем, чистейшей, я бы сказал, дистиллированной - физики.
Скорее всего, вам для начала понадобится пересохранить их в каком-то общепонятном виде, если собираетесь анализировать с помощью Excel или мат. пакета. Почему это не сделали изначально, я без понятия, можно было сразу в .txt писать. Но я когда-то тоже сохранения копеечных данных в бинарники практиковал... И если не стоит задачи быть жлобом на 2 Мб в эпоху многотерабайтных дисков, то лучше в виде пар время-значение.
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
25.10.2023, 13:30
Цитата Сообщение от ygy Посмотреть сообщение
Правда не работает OemToChar(hdr.WTF_80, sName);
Можно так:
Delphi
1
2
3
var Value: AnsiString;
...
OemToCharBuffA(PAnsiChar(Value), PAnsiChar(Value), ValSize);
0
пофигист широкого профиля
4770 / 3206 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
26.10.2023, 01:54
Единственная универсальная таблетка в подобных случаях - это мозг.
Но этот мозг должен уже иметь достаточный уровень знаний.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.10.2023, 01:54

Поддается ли дешифровке BlowFish
Есть проблема. Зашифровали неизвестной программкой папку с нужными файлами. Достали часть их из бэкапов, т.е. у нас теперь есть оригинал и...

Нюансы в шифровании и дешифровке
Здравствуйте, тема, которую я создаю, является похожей на иные подобные, но всё же я обращусь к сообществу, т.к. сам не являюсь адептом...

Нужна помощь в дешифровке RijndaelManaged
Не получается преобразовать закодированный текст назад. Пишет &quot;недопустимые символы&quot;. Помогите пожалуйста, подскажите где ошибка? ...

При дешифровке пропадает буква 'я'
при дешифровке пропадает буква 'я'. шифрование &lt;?php if(isset($_POST)) { $k = 3; $X = fopen(&quot;new.txt&quot;,...

AES шифрование, ошибка в дешифровке
Приветы! Задача такова: пользователь выбирает файл, файл шифруется, создается зашифрованный файл, файл расшифровывается и создается...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
71
Ответ Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru