Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обратный алгоритм.


Pepe ©   (2011-08-17 12:26:00) 

Добрый день участники форума.
Появилась необходимость в переводе данного алгоритма, к обратному виду. Т.е из полученных данных получить исходные.
function TPacketStream.ReadCompactInt: DWORD;
var
 V: dword;
 B1,b2,b3,b4: Byte;
begin
 B1:= ReadByte;
 if B1 < $80 then
 begin
   V:= B1;
 end
 else begin
   if B1 < $C0 then
   begin
     B2:= ReadByte;
     V:= ((B1 shl 8) or b2) and $3FFF;
   end
   else begin
     B2:= Readbyte;
     B3:= ReadByte;
     B4:= ReadByte;
     V:= ((B1 shl 24) or (B2 shl 16) or (b3 shl 8) or b4) and $1FFFFFFF;
   end;
 end;

 Result:= V;
end;

Т.е нужно реализовать метод WriteCompactInt. Буду премного благодарен в помощи.


Pepe   (2011-08-17 15:35:00) [1]

В цикле не Break, а Exit


Pepe   (2011-08-17 15:34:00) [2]

Нашёл способ, но конечно это всего лишь заплатка для данных размером до ~16500 байт. Пакеты большим размером я отправлять не собираюсь, поэтому этого хватит.

function TPacketStream.WriteCompactInt(const Value: DWORD): Int64;
var
 x,y: Integer;
 b1,b2: Byte;
begin
 Result:= -1;

 if Value < $80 then
 begin
   Result:= WriteByte(Byte(Value));
   Exit;
 end;

 if Value <= $3FFF then
 begin
   for x:= $80 to $BE do
   begin
     for y:= 0 to $FF do
     begin
       b1:= x;
       b2:= y;
       if Value = ((B1 shl 8) or b2) and $3FFF then
       begin
         Result:= WriteByte(B1);
         Result:= Result + WriteByte(B2);
         Break;
       end;
     end;
   end;
 end else
  raise Exception('Выход за пределы допустимых значений');
end;


PEPe   (2011-08-17 13:44:00) [3]

> Nano-Tek: угу, так и есть.


> DiamondShark ©   (17.08.11 13:42) [6]
>
>
> > Pepe   (17.08.11 12:26)
>
> MIDI файлы парсим?


С сервера пакеты читаю, а внутри пакета в качестве размера является именно это число. Теперь появилась необходимость самому записывать это число и пересылать серверу.


DiamondShark   (2011-08-17 13:42:00) [4]


> Pepe   (17.08.11 12:26) 

MIDI файлы парсим?


NanoTek   (2011-08-17 13:39:00) [5]

CompactInt строится так:
Обычное число:                         CompactInt:
0..7F                                          0..7F
80..3FFF                                     8080..BFFF
4000 ... 1FFFFFFF                        C0004000 ... DFFFFFFF
20000000...FFFFFFFF                   E020000000..E0FFFFFFFF


oldman   (2011-08-17 12:54:00) [6]

я сейчас напряженно думаю над обратных операциях для or и and
:)))


Pepe   (2011-08-17 12:51:00) [7]

PacketStream - ничто иное как дочерний класс TMemoryStream

а функия ReadByte есть:
function ReadByte: Byte;
begin
 Read(Result,1);
end;


oldman   (2011-08-17 12:43:00) [8]

гы...

if V>=$80 then begin
 B1:=V;
 B2:= черти че;
 B3:= черти че;
 B4:= черти че;
end;


oldman   (2011-08-17 12:39:00) [9]


>  B1:= ReadByte;
>  B2:= Readbyte;
>  B3:= ReadByte;
>  B4:= ReadByte;


Я что-то пропустил в языке?
Что это?


Наверх

Титульная страница Поиск, карта сайта Написать письмо