Stream - не знаю как вывести data, нужна консультация

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Stream - не знаю как вывести data, нужна консультация

Сообщение vitaly_l » 25.03.2013 16:34:32

Всем привет.
Спасите-помогите: пожалуйста.

Есть Stream, он читается и данные заносятся в FData, в соответствии с приведенным строчкой кода:

Код: Выделить всё
var
  FData: Pointer;
////////////////////////////////////////
Stream.Read(PByteArray(FData)^[0], DataSize);
////////////////////////////////////////


:?: Как мне превратить данный FData в string или несколько string...
в соответствии с числом в DataSize, с целью посмотреть, что в FData - прочиталось/записалось?




.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Stream - не знаю как вывести data, нужна консультация

Сообщение SSerge » 25.03.2013 17:28:04

Код: Выделить всё

Type AAB=array [0..65535] of byte;
     PAAB=^AAB;
Var FData:Pointer;
     PPD:PAAB;

Stream.Read(PByteArray(FData)^[0], DataSize);

PPD:=FData;
for i:=0 to DataSize-1 do begin
    writeln(i,':',PPD^[i]);
end;




vitaly_l писал(а):с целью посмотреть, что в FData - прочиталось/записалось?
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Stream - не знаю как вывести data, нужна консультация

Сообщение vitaly_l » 25.03.2013 18:01:20

SSerge писал(а):for i:=0 to DataSize-1 do begin
    writeln(i,':',PPD^[i]);


Спасибо, большое добрый SSerge.
Что-то вывелось - это уже ура..., однако я не понимаю: что вывелось?

По идее, в FData должны быть, в том числе float числа с точкой, координаты x,y,z, а вывелись числа в пределах byte(0-255).
Если Вам не составит сложный труд, то ответьте, пожалуйста, ещё на несколько вопросов:
:?: Что именно выводится таким способом(writeln(i,':',PPD^[i]);)?
:?: И как мне byte превратить в координаты?




.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Stream - не знаю как вывести data, нужна консультация

Сообщение bormant » 25.03.2013 18:21:03

vitaly_l писал(а):Что именно выводится таким способом(writeln(i,':',PPD^[i]);)?
Выводится номер байта (i), двоеточие (':'), десятичное представление байта памяти, адресуемой указателем PPD, со смещением i от него.

ps. Читайте уже документацию на бинарный формат вашего файла. Или найдите интерпретированное содержимое и его бинарное представление, возможно удастся установить соответствие расположению в файле.

pps. Возможно в ваших исходниках есть код, который пишет эти файлы -- лучшей документации и придумать сложно.
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Stream - не знаю как вывести data, нужна консультация

Сообщение vitaly_l » 25.03.2013 18:33:18

bormant писал(а):десятичное представление байта памяти, адресуемой указателем PPD, со смещением i от него.

Спасибо, большое добрый bormant.
Однако Ваш ответ не решил всех моих вопросов, т.к. я не понимаю половины слов.

1) десятичное представление байта памяти - это номер символа, который записан в этот байт памяти или что?
2) адресуемой указателем PPD, со смещением i от него <= это ещё сложнее, т.к. с одной стороны я понимаю текст, но не понимаю смысл.

:?: Как мне декодировать информацию, записанную в этих байтах памяти в человеко-читабельный формат?



.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Stream - не знаю как вывести data, нужна консультация

Сообщение bormant » 25.03.2013 18:58:00

Вот вам простой пример, 4 значения в памяти -- одно двойное слово, три числа с плавающей точкой двойной точности, и их текстовое (произвольное) и двоичное представление:
Код: Выделить всё
type
  PSomeRec = ^TSomeRec;
  TSomeRec = record
    id: longword;
    x, y, z: double;
  end;

procedure DumpSomeRec(const R: TSomeRec);
begin
  with R do WriteLn('SR{ID=', id, ';', x, ',', y, ',', z, '}');
end;

procedure DumpHex(var V; Size: word);
const
  HD: array [0..$F] of char = '0123456789ABCDEF';
var
  M: array [0..65535] of byte absolute V;
  i: word;
begin
  for i := 0 to Size-1 do begin
    Write(' ', HD[M[i] shr 4], HD[M[i] and $F]);
    if (i+1) and $F = 0 then WriteLn;
  end;
end;

var
  r: TSomeRec;

begin
  with r do begin
    id := $12345678;
    x := 2.5; y := 3.8; z := -7.4;
  end;
  DumpSomeRec(r);
  DumpHex(r, sizeof(r));
end.
Прогон:
Код: Выделить всё
SR{ID=305419896; 2.50000000000000E+000, 3.80000000000000E+000,-7.40000000000000E+000}
78 56 34 12 00 00 00 00 00 00 00 00 00 00 04 40
66 66 66 66 66 66 0E 40 9A 99 99 99 99 99 1D C0

Вы при чтении получаете двоичное представление. Чтобы получить адекватное текстовое, достаточно знать размеры данных и правила их интерпретации (да, это называется типы), а для многобайтных значений -- ещё и порядок байт (от старшего к младшему или от младшего к старшему), грубо говоря прочитать в переменную соответствующего типа или преобразовать адрес в памяти к указателю на соответствующий тип и разыменовать его, например: with PSomeRec(Data)^ do WriteLn(id, x, y, z);

Расшифровка полей:
Код: Выделить всё
78 56 34 12 00 00 00 00 00 00 00 00 00 00 04 40
^---(1)---^ ^---(2)---^ ^---------(3)---------^
66 66 66 66 66 66 0E 40 9A 99 99 99 99 99 1D C0
^---------(4)---------^ ^---------(5)---------^
1 - число 305419896 в 10-чной системе счисления, оно же 12345678 в 16-ричной,
2 - "дырка" -- выравнивание на границу 8 байт,
3 - x: 2.5 с двойной точностью (8 байт),
4 - y: 3.8 с двойной точностью,
5 - z: -7.4 с двойной точностью.

Если бы запись была объявлена как "packed record", её представление в памяти было бы таким:
Код: Выделить всё
78 56 34 12 00 00 00 00 00 00 04 40 66 66 66 66
^---(1)---^ ^---------(3)---------^ ^-----(4...
66 66 0E 40 9A 99 99 99 99 99 1D C0
...4)-----^ ^---------(5)---------^
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Stream - не знаю как вывести data, нужна консультация

Сообщение vitaly_l » 25.03.2013 19:28:38

Спасибо большое, добрый bormant за столь подробные объяснения и примеры.

Я сделал вот так: TMemo.Add(IntToStr(i)+' => '+chr(PPD^[i])); и получил результат, того что записано в PPD^[i].
В полученном результате по буквам можно прочитать слова и другие символы, которые я мог прочитать открыв этот файл в обыкновенном блокноте.
Но в файле не простой текст, а форматированный (очевидно стандартно форматированный), я не пограммист и мне трудно правильно сформулировать название таких файлов: бинарный, текстовый, или скорее всего типизированный или около того... Чтобы было понятно речь идёт о формате на подобии MicrosoftWord'овского *.doc, там тоже половина текста остается нормальными буквами а половина как-то хитро форматируется.

Так вот мне нужно декодировать этот форматированный файл на нормальный язык, чтобы вместо закорючек были цифры, а слова там уже читаются как в блокноте.
:?: Как это делается? Как читаются бинарные или точнее типизированные файлы?
Я просто не знаю что искать в поиске, чтобы получить недостающие знания.


.
Последний раз редактировалось vitaly_l 25.03.2013 19:39:44, всего редактировалось 2 раз(а).
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Stream - не знаю как вывести data, нужна консультация

Сообщение bormant » 25.03.2013 19:37:23

vitaly_l,
к сожалению, телепатические возможности у меня отсутствуют напрочь, поэтому документация на формат мне отсюда не очень видна, как и содержимое файлов и правильная их интерпретация. В отсутствие перечисленного рецепт один -- к гадалке.
vitaly_l писал(а):Как читаются бинарные или точнее типизированные файлы?
Также как пишутся, только наоборот, вместо записи -- чтение.

ps. У вас проблемы не с чтением, а с правильной интерпретацией прочитанного. Для этого как минимум нужно знать, что и как туда пишется.

Добавлено спустя 7 минут 19 секунд:
Например, вот описание формата файла DBF (но не всех существующих, источник http://wotsit.org/list.asp?search=dbf), по которому относительно легко написать его корректное чтение:
Код: Выделить всё
Your DBF description is iffy to say the least.  I am enclosing
a more accurate file layout. Note it include dBaseIII+, dBaseIV,
FoxBase, FoxPro upto and including 2.6.


DBF FILE STRUCTURE
~~~~~~~~~~~~~~~~~~

BYTES   DESCRIPTION
00   FoxBase+, FoxPro, dBaseIII+, dBaseIV, no memo - 0x03
        FoxBase+, dBaseIII+ with memo - 0x83
   FoxPro with memo - 0xF5
   dBaseIV with memo - 0x8B
   dBaseIV with SQL Table - 0x8E

01-03   Last update, format YYYYMMDD   **correction: it is YYMMDD**
04-07   Number of records in file (32-bit number)
08-09   Number of bytes in header (16-bit number)
10-11   Number of bytes in record (16-bit number)
12-13   Reserved, fill with 0x00
14   dBaseIV flag, incomplete transaction
        Begin Transaction sets it to 0x01
   End Transaction or RollBack reset it to 0x00

15      Encryption flag, encrypted 0x01 else 0x00
        Changing the flag does not encrypt or decrypt the records

16-27   dBaseIV multi-user environment use
28   Production index exists - 0x01 else 0x00
29   dBaseIV language driver ID
30-31   Reserved fill with 0x00
32-n   Field Descriptor array
n+1   Header Record Terminator - 0x0D

FIELD DESCRIPTOR ARRAY TABLE
BYTES   DESCRIPTION
0-10    Field Name ASCII padded with 0x00
11   Field Type Identifier (see table)
12-15   Displacement of field in record
16   Field length in bytes
17   Field decimal places
18-19   Reserved
20   dBaseIV work area ID
21-30   Reserved
31    Field is part of production index - 0x01 else 0x00

FIELD IDENTIFIER TABLE
ASCII   DESCRIPTION
C       Character
D       Date, format YYYYMMDD
F       Floating Point
G       General - FoxPro addition
L       Logical, T:t,F:f,Y:y,N:n,?-not initialized
M       Memo (stored as 10 digits representing the dbt block number)
N       Numeric
P       Picture - FoxPro addition

Note all dbf field records begin with a deleted flag field.
If record is deleted - 0x2A (asterisk) else 0x20 (space)
End of file is marked with 0x1A
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Stream - не знаю как вывести data, нужна консультация

Сообщение vitaly_l » 25.03.2013 19:50:08

bormant писал(а):Также как пишутся, только наоборот, вместо записи -- чтение.

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

.

Добавлено спустя 12 минут 24 секунды:
У меня кстати есть описание точнее SDK, по программе... быть может там есть описание?
А вот ещё некоторое описание:

Код: Выделить всё
Object File Example

  A simple object (with somewhat complex surfaces) is listed below to
  illustrate some of the features of a FORM LWOB.  The object is an
  image-mapped bumpy square polygon in the XY plane with a shiny
  transparent yellow triangle as a detail polygon.  Each line of the
  listing shows 16 bytes in hexadecimal form followed by their ASCII
  equivalents.  The notes under each line should be read from left to
  right rather than top to bottom.

  464F524D 0000019C 4C574F42 504E5453    FORM....LWOBPNTS
  00000054 3F800000 3F800000 00000000    ...T?...?.......
           ^^^^^^^^ ^^^^^^^^ ^^^^^^^^
           The X, Y, and Z coordinates of point number zero are 1.0,
           1.0, and 0.0 (in IEEE format).
      ^^^^
      There are 84 bytes in the PNTS chunk, so there are seven points
      in the object.

  BF800000 3F800000 00000000 3F800000    ....?.......?...
  BF800000 00000000 BF800000 BF800000    ................
  00000000 3F000000 BF000000 00000000    ....?...........
  00000000 3F000000 00000000 BF000000    ....?...........
  BF000000 00000000 53524653 00000012    ........SRFS....
  53717561 72650000 54726961 6E676C65    Square..Triangle
               ^^^^
               The surface name "Square" is terminated with two nulls
               to even out the number of bytes.

  0000504F 4C530000 00180004 00010000    ..POLS..........
                        ^^^^
                        The first polygon has four vertices (which
                        are points 1, 0, 2, and 3).

  00020003 FFFF0001 00030005 00040006    ................
                    ^^^^
                    The detail polygon has three vertices (which are
                    points 5, 4, and 6).
               ^^^^
               One detail polygon follows.
           ^^^^
           The first polygon's surface code is -1, so it uses surface
           number one ("Square") and has detail polygons.

  00025355 52460000 00AE5371 75617265    ..SURF....Square
      ^^^^ ^^^^
      This begins the description of the surface called "Square".
  ^^^^
  The detail polygon uses surface number two ("Triangle").

  0000434F 4C520004 C8C8C800 464C4147    ..COLR......FLAG
  00020000 44494646 00020100 43544558    ....DIFF....CTEX
                             ^^^^^^^^
                             The next set of texture sub-chunks
                             pertain to the surface's color texture.
                        ^^^^
                        The "Square" surface's diffuse setting is
                        100% (256 out of 256).

  0012506C 616E6172 20496D61 6765204D    ..Planar Image M
      ^^^^ ^^^^^^^^ ^^^^^^^^ ^^^^^^^^
      The color texture is planar mapping of the image in the IFF
      file "RAM:Laura".

  61700000 54494D47 000A5241 4D3A4C61    ap..TIMG..RAM:La
  75726100 54464C47 00020004 5453495A    ura.TFLG....TSIZ
                        ^^^^
                        The flag bits indicate that the image is to
                        be projected along the Z axis.

  000C4000 00003FC0 00003F80 00005443    ..@...?...?...TC
      ^^^^ ^^^^^^^^ ^^^^^^^^ ^^^^
      The X, Y, and Z texture sizes are 2.0, 1.5, and 1.0.

  4C520004 00000000 42544558 000E4672    LR......BTEX..Fr
                    ^^^^^^^^
                    The next set of texture sub-chunks pertain to the
                    "Square" surface's bump texture.

  61637461 6C204275 6D707300 54464C47    actal Bumps.TFLG
  0002000A 5453495A 000C3DCC CCCD3DCC    ....TSIZ..=...=.
      ^^^^
      The flag bits indicate that "Worlds Coords" is turned on.

  CCCD3DCC CCCD5441 4D500004 3FC00000    ..=...TAMP..?...
                             ^^^^^^^^
                             The amplitude of the bumps is 150% (1.5
                             in IEEE format).

  54465251 00020001 53555246 00000044    TFRQ....SURF...D
                    ^^^^^^^^
                    This begins the description of the surface called
                    "Triangle".
               ^^^^
               The bump texture uses one frequency of noise.

  54726961 6E676C65 0000434F 4C520004    Triangle..COLR..
  F0B40000 464C4147 00020000 44494646    ....FLAG....DIFF
  ^^^^^^^^
  The "Triangle" surface's color is yellow (240 red, 180 green, and 0
  blue).

  0002009A 53504543 000200CD 474C4F53    ....SPEC....GLOS
                        ^^^^
                        The surface's specular setting is 80 % (205
                        out of 256).

  00020100 5245464C 00020033 5452414E    ....REFL...3TRAN
                        ^^^^
                        The surface's reflection map setting is 20%
                        (51 out of 256), but there is no RIMG sub-
                        chunk, so the surface reflects the backdrop.
      ^^^^
      The surface has a high glossiness (256).

  00020066                               ...f
      ^^^^
      The surface is 40% transparent (102 out of 256).

  The "Triangle" surface has no textures, and there are no more
  surfaces to be defined, so the object file ends here.


Вышеприведённое описание даёт объяснение как читать файл?
Последний раз редактировалось vitaly_l 25.03.2013 20:51:55, всего редактировалось 2 раз(а).
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Stream - не знаю как вывести data, нужна консультация

Сообщение bormant » 25.03.2013 20:03:57

Как читать -- нет. Как интерпретировать прочитанное -- да.
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Stream - не знаю как вывести data, нужна консультация

Сообщение vitaly_l » 25.03.2013 20:07:50

bormant писал(а):Как интерпретировать прочитанное -- да.

Поясните, 80% файла я считываю и заношу в память и могу вывести.
Мне как раз и нужно понять как его интерпретировать, как интерпретировать сами координаты?
Всё остальное я вижу и читаю, а также разбиваю файл на нужные кусочки. просто у меня нет нужного образования.
Для меня то что написано в файле - чужое не моё; не понимаю, о чём там. Я программирую на другом уровне.



.
Последний раз редактировалось vitaly_l 25.03.2013 20:12:50, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Stream - не знаю как вывести data, нужна консультация

Сообщение bormant » 25.03.2013 20:11:10

vitaly_l писал(а):для меня то что написано в файле - чужое не моё; не понимаю, о чём там.
Вы себе в блокнотике переведите на родной язык, сразу всё станет понятно, описание довольно простое и подробное. Жаль не очень полное.
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Stream - не знаю как вывести data, нужна консультация

Сообщение alexey38 » 25.03.2013 20:50:46

У Вас там судя по всему: http://open-file.ru/types/lwo
http://ru.wikipedia.org/wiki/LightWave_3D
Если это так, то не пытайтесь самостоятельно читать бинарный формат довольно навороченной системы. Не все так просто. Там скорее всего будут вложенные объекты, модели и т.п. Возможно, что пока не создадите аналог модели данных, то и не сможете прочитать. На это могут уйти месяцы или годы.
Если есть SDK, то не парьте мозги, а просто используйте сам SDK, он для того и предназначен, или ищите библиотеки.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Stream - не знаю как вывести data, нужна консультация

Сообщение vitaly_l » 25.03.2013 21:09:26

alexey38 писал(а):Если это так, то не пытайтесь самостоятельно читать бинарный формат довольно навороченной системы. Не все так просто. Там скорее всего будут вложенные объекты, модели и т.п. Возможно, что пока не создадите аналог модели данных, то и не сможете прочитать. На это могут уйти месяцы или годы. Если есть SDK, то не парьте мозги, а просто используйте сам SDK, он для того и предназначен, или ищите библиотеки.


Спасибо за добрый совет. Я уже чуть чуть перевёл. Там стандартный IFF формат.

Используется некая IFF c структура построения файлов. Суть простая. Файл делиться на кусочки (Chank), и в этих кусочках храниться информация, структура файла точно совпадает как описано в нижеприведенной ссылке из wikipedia. Я на эти кусочки - файл уже делю. И текст из этих кусочков я получаю. И этот текст совпадает с нижеприведённым примером из wikipedia...

:?: Единственное что я не могу понять: Как вот эти 12 байт привести к нормальным десятичным цифрам?

Для программистов - это стандартная задача, а я немножечко другой программист... Если нормальные программисты делятся на программистов низкого и высокого уровня, то я программист сверхвысокого уровня :cry: . В смысле я использую в программировании конечный продукт и в 50% случаев даже не знаю как устроены модули которые я использую. В Лазарусе с этим просто: посмотрел Ctrl+клик и идентифицировал, а здесь нужно иметь образование которого у меня нет. Вот... нажаловался на себя :oops: :cry: :evil: ...

Вот пример из wikipedia

Код: Выделить всё

typedef struct {
char ID[4]; // FourCC идентификатор
LONG Size; // Размер блока данных
UBYTE Data[Size]; // Данные
} Chunk;

Проиллюстрируем чанк «CMAP», состоящий из 12 байт:
ID «CMAP»
Size 12
Data 0, 0, 0, 32
0, 0, 64, 0
0, 0, 64, 0
(12 байт)



Полностью статья вот здесь: http://ru.wikipedia.org/wiki/Interchange_File_Format


Вот как эти чёртовы (12 байт):
Data =
0, 0, 0, 32
0, 0, 64, 0
0, 0, 64, 0
(12 байт)
привести к нормальным числам?
Чтобы был более понятен вопрос, если я правильно понял: эти (12 байт) - это одно число или быть может 3 числа по 4 байта = 12...




.

Добавлено спустя 51 минуту 19 секунд:
Это как то связано с IEEE, очевидно с IEEE 754 в смысле числа с плавающей точкой.



.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Stream - не знаю как вывести data, нужна консультация

Сообщение bormant » 25.03.2013 23:55:31

vitaly_l,
вы упоминали SDK, давайте ссылку, хватит уже резать собачий хвост кусочками.
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

След.

Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru