у меня получилось примерно это
Функции не тестировал, заранее приношу извинения за ошибки.
короче, разбираться со всем этим надо долго и тоскливо.
особенно угнетает переменная длина, из-за чего надо использовать динамич массивы. При чтении файла не забудь команду выделения под него памяти 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;