Много ли съм тъп?

2 отговора 0 прегледа
#1

Много ли съм тъп?

 

Здравейте,
Необходима ми е помощ. Опитвам се да декодирам и кодирам едни масиви...
Декодирането - май е добре. Ама кодирането - направо ще ...

Тъй... Имаме един масив от байтове (Byte), деклариран по следния начин


var
CompactArray:array [0..20] of byte;

Четем го от някъде си... да предположим че е запълнен по следния начин

'FF FF FF FF FF FF FF FF FF FF FF 7F 00 00 E0 FF FF FF FF FF FF '


Същият масив, трябва да се преобразува в друг масив от битове, (YArray :Array [0..167] of Boolean;) като се приложи съответно отместване (виж процедурата по-долу) .

Не мога да направя обратното преобразуване Все се получават различни резултати...


 


procedure SoMeProcedure(Bias:Integer);
var
iCount, z, k, j, m:Integer;
OneInt:Byte;
begin

j:=0;

for iCount:=0 to 20 do
begin
z:=1;
for k := 0 To 7 do
begin
m := 8*j + k - Bias;
if (m < 0) then m := m + 168;
if (m > 167) then m := m - 168;

OneInt:=CompactArray[iCount];
if (OneInt and Z)=Z then
YArray [m] := 1
else
YArray [m] := 0 ;
Inc(z,z); //Z:=Z*2
end;
Inc(j)
end;

end;



В конкретния случай YArray съдържа

 


(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)



Когато се опитвам да напиша "обратната" процедура, която превръща YArray в CompactArray,
получавам най-различни глупости, но не и изходните стойности...
А да - Bias в конкретния случай е -2 (минус 2, демек БГ отместването в часове от UNC/GMT)

Някой да помогне?!?

Отговор
в отговор на ИвKo #2

Re: Много ли съм тъп?

Абе много сложно си го направил...
Аз бих написал нещо такова:

program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils;

var
bytes : Array[0..20] of Byte = ($FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF,
$FF, $7F, $00, $00, $E0, $FF, $FF, $FF, $FF, $FF, $FF);
bits : Array[0..21 * 8 - 1] of Boolean;

procedure BytesToBits(bias : Integer);
var i, j, k : Integer;
begin
k := -bias;
if k < 0 then k := k + Length(bits);
if k > High(bits) then k := k - Length(bits);
for i := 0 to High(bytes) do
for j := 0 to 7 do begin
bits[k] := bytes[ i ] and (1 shl j) <> 0;
k := (k + 1) mod Length(bits);
end;
end;

procedure BitsToBytes(bias : Integer);
var i, j, k : Integer;
begin
k := -bias;
if k < 0 then k := k + Length(bits);
if k > High(bits) then k := k - Length(bits);
for i := 0 to High(bytes) do begin
bytes[ i ] := 0;
for j := 0 to 7 do begin
bytes[ i ] := bytes[ i ] or (Byte(bits[k]) shl j);
k := (k + 1) mod Length(bits);
end;
end;
end;

// за тест:
var i : Integer;
begin
BytesToBits(25);
for i := 0 to High(bits) do begin
if i mod 21 = 0 then writeln;
write(byte(bits[ i ]));
end;
BitsToBytes(25);
writeln;
for i := 0 to High(bytes) do begin
write(IntToHex(bytes[ i ], 2), ' ');
end;
readln;
end.


Отговор
в отговор на Formal #3

Re: Много ли съм тъп?

Явно е че съм тъп
Хиляди благодарности !!!

Отговор