Показать сообщение отдельно
  #13  
Старый 27.08.2011, 10:56
chainik chainik вне форума
Начинающий
 
Регистрация: 30.06.2008
Сообщения: 140
Репутация: 8882
По умолчанию

у меня получилось примерно это
Функции не тестировал, заранее приношу извинения за ошибки.
короче, разбираться со всем этим надо долго и тоскливо.
особенно угнетает переменная длина, из-за чего надо использовать динамич массивы. При чтении файла не забудь команду выделения под него памяти SetLength(NumAbon, <длина номера абонента>)

Возможно лучшим решением было бы использовать потоки.

Код:
type

TP101=record
     Packet:byte;    // номер пакета=101
     Dlina:byte;     // рез + длина номера
     NumAbon:array of byte;  // номер абонента
     end;



var
P101:Tp101;

function GetRes():integer;
begin
Result:=P101.Dlina shr 6;
end;

function GetDlinaNum():integer;
begin
Result:=P101.Dlina and $3F;
end;

{---------------------------------------------------------
    переводит упакованный массив байт
    номера абонента в строку
на Ассемблере было бы изящнее. 
Но учитывая малую длину поля-можно и так.
------------------------------------------------------------}
function UnPack(var NN:array of byte):string;
var
p:^byte;
begin
Result:='';
p:=@NN[0];         //уст указатель на 1 байт -1
dec(p,1);
    repeat
    inc(p);
    Result:=Result + char(p^ shr 4 + ord('0')) + char((p^ and $FF + ord('0')));
    until p=@NN[High(NN)];
end;
Ответить с цитированием