Pointer - требуется уточнение
Добавлено: 31.03.2013 14:15:17
Всем привет и всем хорошего настроения!
дано:
В память с указателем FData - из TStream, считываются и заменяются разные данные с разным объёмом и содержимым из одного файла;
Задача: нужно их декодировать.
1) Если вывести for i:=0 to DataSize do TMemo.Add(HD[PPD^ shr 4]+HD[PPD^[i] and $F]);, то в TMemo заносится всё содержимое FData и там есть все данные которые нужны. Задача: нужно их декодировать. Но данные не подвержены, какой-то стабильной структуре и в зависимости от содержимого структура FData меняется. По сути там записаны примерно такие данные:
"DAT1" = 12;
"DAT2" = 12.12341234;
"DAT3" = ''привет';
"DAT4" = (1)|(3)|(5);
"DAT5" = DAT8 := любой из "DAT1"..."DAT7";
"DAT6" = (11.1234)|(2.45634)|(5.3576);
"DAT7" = FSubData; // ещё одна FData в которой лежат array of "DAT1", "DAT2", "DAT3", "DAT4", "DAT5" итд
Задача: Нужно вывести: var dat1 := его значение; var dat2 := его значение; var dat3 := его значение; итд
При этом "DAT1"..."DAT7" - не обязательно имеют такой порядок и необязательно могут быть все... (могут быть только "DAT1" и "DAT5")...
2) Если вывести TMemo.Add(PChar(FData)); то выводится первые четыре буквы из FData, на подобии "DAT1", "DAT2" или "DAT3" итп.
Вопрос: Правильно ли я понимаю, что после первых четырёх символов стоит "#0" и поэтому PChar(FData) выводит только первые 4 буквы?
При этом, если сделать if (PChar(FData) = "DAT3") then ShowMessage('DAT3');, то ничего не будет, хотя в TMemo "DAT3" - запишется. Почему так? Или "#0" стоит после ещё каких-то символов, поэтому PChar(FData) не равно "DAT3"?
Вопросы:
Существуют ли, стандартные схемы чтения и декодирования таких данных или это всегда согласовывается в SDK?
Как правильно узнавать объём памяти зарезервированный указателем FData?
Как правильно читать память с указателем FData не с первого символа, а например с 12?
Как правильно узнавать длину кусочка FData от 12 символа и до знака "#0"? (Если я правильно понимаю в FData может быть много "#0" ?)
Можно ли указатель FData разбить на много под-указателей на подобии FDataDAT1^, FDataDAT2^, FDataDAT3^ и т.д. в соответствии с разделением по "#0", если оно существует или в соответствии с делением на: "DAT1", "DAT2" или "DAT3" итп.?
Любая дополнительная информация востребована.
PS: [i]Заранее благодарен за любой информативный ответ.
.
дано:
- Код: Выделить всё
type
AAB=array [0..65535] of byte;
PAAB=^AAB;
const
HD: array [0..$F] of char = '0123456789ABCDEF';
var
FData : Pointer;
В память с указателем FData - из TStream, считываются и заменяются разные данные с разным объёмом и содержимым из одного файла;
Задача: нужно их декодировать.
1) Если вывести for i:=0 to DataSize do TMemo.Add(HD[PPD^ shr 4]+HD[PPD^[i] and $F]);, то в TMemo заносится всё содержимое FData и там есть все данные которые нужны. Задача: нужно их декодировать. Но данные не подвержены, какой-то стабильной структуре и в зависимости от содержимого структура FData меняется. По сути там записаны примерно такие данные:
"DAT1" = 12;
"DAT2" = 12.12341234;
"DAT3" = ''привет';
"DAT4" = (1)|(3)|(5);
"DAT5" = DAT8 := любой из "DAT1"..."DAT7";
"DAT6" = (11.1234)|(2.45634)|(5.3576);
"DAT7" = FSubData; // ещё одна FData в которой лежат array of "DAT1", "DAT2", "DAT3", "DAT4", "DAT5" итд
Задача: Нужно вывести: var dat1 := его значение; var dat2 := его значение; var dat3 := его значение; итд
При этом "DAT1"..."DAT7" - не обязательно имеют такой порядок и необязательно могут быть все... (могут быть только "DAT1" и "DAT5")...
2) Если вывести TMemo.Add(PChar(FData)); то выводится первые четыре буквы из FData, на подобии "DAT1", "DAT2" или "DAT3" итп.
Вопрос: Правильно ли я понимаю, что после первых четырёх символов стоит "#0" и поэтому PChar(FData) выводит только первые 4 буквы?
При этом, если сделать if (PChar(FData) = "DAT3") then ShowMessage('DAT3');, то ничего не будет, хотя в TMemo "DAT3" - запишется. Почему так? Или "#0" стоит после ещё каких-то символов, поэтому PChar(FData) не равно "DAT3"?
Вопросы:
Существуют ли, стандартные схемы чтения и декодирования таких данных или это всегда согласовывается в SDK?
Как правильно узнавать объём памяти зарезервированный указателем FData?
Как правильно читать память с указателем FData не с первого символа, а например с 12?
Как правильно узнавать длину кусочка FData от 12 символа и до знака "#0"? (Если я правильно понимаю в FData может быть много "#0" ?)
Можно ли указатель FData разбить на много под-указателей на подобии FDataDAT1^, FDataDAT2^, FDataDAT3^ и т.д. в соответствии с разделением по "#0", если оно существует или в соответствии с делением на: "DAT1", "DAT2" или "DAT3" итп.?
Любая дополнительная информация востребована.
PS: [i]Заранее благодарен за любой информативный ответ.
.