Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.12.04;
Скачать: CL | DM;

Вниз

Обратный алгоритм.   Найти похожие ветки 

 
Pepe   (2011-08-17 12:26) [0]

Добрый день участники форума.
Появилась необходимость в переводе данного алгоритма, к обратному виду. Т.е из полученных данных получить исходные.
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. Буду премного благодарен в помощи.


 
oldman ©   (2011-08-17 12:39) [1]


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


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


 
oldman ©   (2011-08-17 12:43) [2]

гы...

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


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

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

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


 
oldman ©   (2011-08-17 12:54) [4]

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


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

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


 
DiamondShark ©   (2011-08-17 13:42) [6]


> Pepe   (17.08.11 12:26) 

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


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

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


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


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


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

Нашёл способ, но конечно это всего лишь заплатка для данных размером до ~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 15:35) [9]

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



Страницы: 1 вся ветка

Текущий архив: 2011.12.04;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.01 c
1-1276169691
kukuruza
2010-06-10 15:34
2011.12.04
Может TerminateProcess вызызвать BSOD? А то система падает.


15-1313166354
ПЛОВ
2011-08-12 20:25
2011.12.04
Автотестирование ПО - что почитать?


2-1313476457
Cobalt
2011-08-16 10:34
2011.12.04
Left side cannot be assigned to (D2007)


8-1220951683
Konung
2008-09-09 13:14
2011.12.04
Рисовать на pf32bit битмапе


2-1313569604
Pepe
2011-08-17 12:26
2011.12.04
Обратный алгоритм.