Форум: "Начинающим";
Текущий архив: 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