Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.12.04;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





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


15-1312810075
Leon-Z
2011-08-08 17:27
2011.12.04
Компоненты DB.


6-1246383174
ganzzz
2009-06-30 21:32
2011.12.04
Кто нибудь встречал заголовок wget?


2-1313585266
Antoxa
2011-08-17 16:47
2011.12.04
Load/Save ListView


2-1312296516
Foma
2011-08-02 18:48
2011.12.04
TIdMultiPartFormDataStream и русский текст





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский