Chetene na string ot PByte

5 отговора 132 прегледа
#1

Chetene na string ot PByte

Nqkoi moje li da dade edno ramo. Imam edin memorymappedfile i dannite sa vuv PByte. Imam index za nachaloto i kraq na teksta, koito mi trqbva. Kak da si kopiram po nai-dobriq nachin teksta ot PByte. Eto kakvo pravq vuv momenta:

function GetData(startindex, endindex: Integer): string;
var
PData: PChar;
i: Cardinal;

begin
Result := '';
PData := PChar(FData); //FData: PByte na MMF

if startindex > endindex then
endindex := StrLen(PData) - 1;

for i := startindex to endindex do
Result := Result + PData;
end; //End of GetData

Ne mi izglejda optimizirana tazi funkciika.

by Wise Guy
[email protected]
Отговор
в отговор на Wise Guy #2

Re: Chetene na string ot PByte

Izvinqvaite no pak [i ] razvalq neshtata.
Qvno vse pak nikoi ne moje da mi pomogne. Kato potursih iz SDK vidqh edno CopyMemory i kato dadoh da mu vidq source-a vidqh che polzva Move. Sled tova razgledah i Move i napravih popravkite

function TADic.GetData(startindex, endindex: Integer; Eng: Boolean): string;
var
PData: PChar;
i, int: Integer;

begin
Result := '';
PData := PChar(FData);

if startindex> endindex then
endindex := StrLen(PData) - 1;

int := endindex - skipindex;
SetLength(Result, int); // first allocate space
for i := 1 to int do //then copy the data
Result[i ] := PData[i + skipindex - 1];
end; //End of GetData

Ideqta e purvo da se zadeli pamet i sled tova da se zapulva. Predi tova sus Result := Result + PData; qvno postoqnniq resize na Result e zabavql rabotata. Nqkakvi komentari. Po-dobri predlojeniq? Mislite li che asm shte e po-burzo (trqbva mi vizmojno nai golqmata optimizaciq)...

by Wise Guy
[email protected]
Отговор
в отговор на Wise Guy #3

Re: Chetene na string ot PByte

А пробва ли функцията StrPas (виж Help ). Ako низа е null terminated всичко е ОК. Ако не, копираш го в масив от тип char с големина (endindex - startindex +1)
и добавяш #0 накрая и ползваш същата функция

Отговор
в отговор на Wise Guy #4

Re: Chetene na string ot PByte

var Count: DWORD;
...........................................................................
Count := EndIndex - StartIndex +1;
SetLength(Result, Count);
Move((PChar(FData)+StartIndex)^, Result[1], Count);

Отговор
в отговор на NiL^ #5

Re: Chetene na string ot PByte

takmo se kaneh i az twa da napisha sled tonowete gluposti izpisani tuk :))

Отговор
в отговор на SDR #6

Re: Chetene na string ot PByte

Nadqvam se che ne govorish za moite "gluposti", zashtoto pri testa se vidq, che bachkat ednakvo burzo. Tova e razbiraemo kato se ima predvid, che prosto sum kopiral source-a na Move. Rabotata e che ne znaeh che addresa se zadava taka:
(PData + skipindex)^
Az si misleh che e dostatuchno da napisha:
PData + skipindex
, vidqh che ne stava po tozi nachin i si napravih moi variant na Move. Vse pak shte polzvam Move, zashtoto koda se sukashtava sus 2 reda

10x za pomoshta. Vse pak ako ima oshte po-burz nachin shte mi e interesno da go uznaq.

by Wise Guy
[email protected]
Отговор