dziwny rezultat konwersji

0

hej !
mam dziwny i pewnie głupi problem. podczas konvertowania typów w czasie działania programu pchar<->string, ciąglę otrzymuję inny od pożądanego rezultat. to co powinno być ciągiem 6 dwójek heksadecymenalnych, jest czymś następującym: 'F956006C'#$18 (w podglądzie).
w celu ustalenia w czym tkwi błąd dodałem do kodu coś takiego

type
    TpArray = pchar;
var
    test : string;
    result : TpArray;
[...]
    test:=Result;
    setlength(test,(HashSize div 8));
    result:=pchar(test);
[...]

o dziwo jak zmienię 1 linijkę na

setlength(test,(HashSize div 4));

to wszystko jest ok.
[EDIT]
[poza tym że otrzymuję wtedy 'F956',
ale czemu nie 'F956'#$18 ?]

0

test:=Result; - w test tekst, np.: 4 znaki
setlength(test,(HashSize div 8)); - w test 4 wczesniejsze znaki + ileśtam niezdefiniowanych
result:=pchar(test); - w result też 4znaki sensowne + reszta śmieci

po prostu robisz niezbyt sensowną operację wydłużenia łańcucha bez przypisania mu jakiejś wartości.

[dopisane]
setlength(test,(HashSize div 8)); //(HashSize div 8) = 8 - czyli nie wydłużam łańcucha

to skoro nie wydłużasz łąncucha, to po co ta operacja? a jeśli po prostu go skracasz, to użyj funkcji copy przy przepisywaniu z result do test.

0

po pierwsze, oczywiście nie 6 tylko 4 albo 2 dwójek heksadecymenalnych (chodzi o crc32 i crc16).

tylko że

type
    TpArray = pchar;
var
    test : string;
    result : TpArray;
[...]
    test:=Result;  //(powinno być, a nawet jest jak sprawdziłem 'F956006C'#0 )
    setlength(test,(HashSize div 8));  //(HashSize div 8) = <b>8</b> - czyli nie wydłużam łańcucha
    result:=pchar(test);
//czyli w sumie linijki te nie robią nic
[...]

no a potem mam jak to wszystko wyjdzie z procedure to mam 'F956006C'#$18

hmm...napiszę do bardziej konkretnie wszystko

najpierw mam 4-elementową tablicę byte jako param. wejściowy.
jest to obliczona już suma kontrolna.
tworzę ją tak:

type
     ThDigest = array of Byte;
var
result : ThDigest;
[...]
SetLength(Result,Hash.Algorithm.HashSize div 8); //Hash.Algorithm.HashSize div 8=32/8=4

potem ją konwertuję na heksa, przez funkcję:


function DigestToStr(hDigest : ThDigest) : TpArray;
var
hArray : ThArray;
i : word;
begin
hArray:='';
for i:=0 to High(hDigest) do
    hArray:=hArray+IntToHex(hDigest[i], 2);
Result:=pchar(hArray);
end;

no i to końcowe TpArray okazuje się w zależności od humoru być lub nie być poprawną 4, bądź 8-znakową sumą kontrolną, tzn 8 znakowa zawsze ma jakieś śmieci i zawsze jest to #$18, natomiast 4 znakowa już rzadziej, poza tym śmieci na końcu są różne.

p.s
hmm..zrobiłem kilka nowych prób...od wczoraj...crc32 się nie wsypuje a crc16 bardzo rzadko...a przecież nic nie zmieniałem :|. jak coś wymyślę to napiszę :)

jak na razie jedyne co zauważyłem, to różnice pomiędzy efektami tego samego kodu uruchamianego z biblioteki dll i załadowanego do kodu głównego programu.

DLL
<font size=1>

27C8 <- airforceone.nfo
C82D <- AKS.NFO
18BF <- AOE2CONQ.ACE
6096 <- AOE2CONQ.C00
4433 <- AOE2CONQ.C01
001C <- AOE2CONQ.C02
E9D0 <- AOE2CONQ.C03
0468 <- AOE2CONQ.C04
EBA5 <- AOE2CONQ.C05
58F4 <- AOE2CONQ.C06
6092 <- AOE2CONQ.C07
D9F0 <- AOE2CONQ.C08
6893 <- AOE2CONQ.C09
AFB0 <- AOE2CONQ.C10
2A8F <- AOE2CONQ.C11
6C2B <- AOE2CONQ.C12
85FF <- AOE2CONQ.C13
9272 <- AOE2CONQ.C14
D303 <- AOE2CONQ.C15
AC86 <- AOE2CONQ.C16
5403 <- AOE2CONQ.C17
B588 <- AOE2CONQ.C18
2A51 <- AOE2CONQ.C19
0C46 <- AOE2CONQ.C20
7C00 <- AOE2CONQ.C21
C8BF <- AOE2CONQ.C22
C224 <- AOE2CONQ.C23
DD2D <- AOE2CONQ.C24
8FCE <- AOE2CONQ.C25
4542 <- AOE2CONQ.C26
FBDA <- AOE2CONQ.C27
7748¸ <- AOE2CONQ.C28
90E3 <- AOE2CONQ.C29
E78B <- AOE2CONQ.C30
79C0 <- AOE2CONQ.C31
0224 <- AOE2CONQ.C32
0B6E| <- AOE2CONQ.C33
E8C6 <- AOE2CONQ.C34
96C0 <- AOE2CONQ.C35
509F <- AOE2CONQ.C36
AA5C <- AOE2CONQ.C37
0786 <- AOE2CONQ.C38
DDBD <- AOE2CONQ.C39
7BF6 <- AOE2CONQ.C40
A3D9 <- AOE2CONQ.C41
870C <- AOE2CONQ.C42
BE49 <- AOE2CONQ.C43
2206 <- AOE2CONQ.C44
7819 <- AOE2CONQ.C45
7CFC <- AOE2CONQ.C46
2449 <- AOE2CONQ.C47
4E8A <- AOE2CONQ.C48
4E76 <- AOE2CONQ.C49
BDF0 <- AOE2CONQ.C50
F0D6 <- AOE2CONQ.C51
8DF4 <- AOE2CONQ.C52
FADB <- AOE2CONQ.C53
6393 <- AOE2CONQ.C54
DB80 <- AOE2CONQ.C55
1DC6 <- AOE2CONQ.C56
FD9C <- AOE2CONQ.C57
3B07 <- AOE2CONQ.C58
C242 <- AOE2CONQ.C59
B829 <- AOE2CONQ.C60
6330 <- AOE2CONQ.C61
1FEE <- FILE_ID.DIZ
197E <- H2H.NFO
BB6A <- INSTALL.DAT
1BFB <- Install.exe
C99B <- KANE.NFO
7A0B <- MYTH.NFO
40E6 <- PP.NFO
3B91 <- REZ2K.NFO
4468 <- SECOND.NFO
96B1 <- TBZ.NFO

</span>
kod lokalny:
<font size=1>

27C8 <- airforceone.nfo
C82D <- AKS.NFO
18BF <- AOE2CONQ.ACE
6096 <- AOE2CONQ.C00
4433 <- AOE2CONQ.C01
001C <- AOE2CONQ.C02
E9D0 <- AOE2CONQ.C03
0468 <- AOE2CONQ.C04
EBA5 <- AOE2CONQ.C05
58F4 <- AOE2CONQ.C06
6092 <- AOE2CONQ.C07
D9F0 <- AOE2CONQ.C08
6893 <- AOE2CONQ.C09
AFB0 <- AOE2CONQ.C10
2A8F <- AOE2CONQ.C11
6C2B <- AOE2CONQ.C12
85FF <- AOE2CONQ.C13
9272 <- AOE2CONQ.C14
D303 <- AOE2CONQ.C15
AC86 <- AOE2CONQ.C16
5403 <- AOE2CONQ.C17
B588 <- AOE2CONQ.C18
2A51 <- AOE2CONQ.C19
0C46 <- AOE2CONQ.C20
7C00 <- AOE2CONQ.C21
<- AOE2CONQ.C22
C224 <- AOE2CONQ.C23
<- AOE2CONQ.C24
8FCE <- AOE2CONQ.C25
<- AOE2CONQ.C26
FBDA <- AOE2CONQ.C27
<- AOE2CONQ.C28
90E3 <- AOE2CONQ.C29
E78B <- AOE2CONQ.C30
79C0 <- AOE2CONQ.C31
0224 <- AOE2CONQ.C32
0B6E <- AOE2CONQ.C33
E8C6 <- AOE2CONQ.C34
96C0 <- AOE2CONQ.C35
509F <- AOE2CONQ.C36
AA5C <- AOE2CONQ.C37
0786 <- AOE2CONQ.C38
DDBD <- AOE2CONQ.C39
7BF6 <- AOE2CONQ.C40
A3D9 <- AOE2CONQ.C41
870C <- AOE2CONQ.C42
BE49 <- AOE2CONQ.C43
2206 <- AOE2CONQ.C44
7819 <- AOE2CONQ.C45
7CFC$ <- AOE2CONQ.C46
2449 <- AOE2CONQ.C47
4E8A$ <- AOE2CONQ.C48
4E76$ <- AOE2CONQ.C49
BDF0 <- AOE2CONQ.C50
F0D6$ <- AOE2CONQ.C51
8DF4 <- AOE2CONQ.C52
FADB <- AOE2CONQ.C53
6393 <- AOE2CONQ.C54
DB80 <- AOE2CONQ.C55
ŕ <- AOE2CONQ.C56
FD9C <- AOE2CONQ.C57
3B07 <- AOE2CONQ.C58
C242 <- AOE2CONQ.C59
B8294 <- AOE2CONQ.C60
6330 <- AOE2CONQ.C61
1FEE <- FILE_ID.DIZ
197E4 <- H2H.NFO
<- INSTALL.DAT
1BFB <- Install.exe
C99B <- KANE.NFO
7A0B <- MYTH.NFO
40E6 <- PP.NFO
3B91 <- REZ2K.NFO
4468 <- SECOND.NFO
96B1 <- TBZ.NFO

</span>
proporcje i wygląd tego wszystkiego jest taki sam dla różnych plików.
tzn widać że źle to działa i w 1 i 2 przypadku, ale różnice są widoczne - w tym 2 działa zdecydowanie gorzej.
btw testowałem sobie pamięć ale wszystko tak jakby ok...

please :), any ideas ?

ok działa. :)

zmieniłem ostatnią operację z 

result:=pchar(DigestToStr(HashInsideFile(FileName,HashPattern)));
na
result:=StrNew(pchar(DigestToStr(HashInsideFile(FileName,HashPattern))))

w takim razie mam pytanie
co się dzieje potem z tą standardową zmienną która jest zwracana (result) ?

rezultat funkcji przypisuję potem do zwykłego stringa.

v:=Hash(pchar(s), tFixed, 32); //string:=result

czy jednak muszę jakoś ją zwalniać (StrDispose) ?


// edytuj swoje posty! - Ł

1 użytkowników online, w tym zalogowanych: 0, gości: 1