Chetene na string ot PByte
5 отговора
132 прегледа
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]
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]
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]
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]
Re: Chetene na string ot PByte
А пробва ли функцията StrPas (виж Help ). Ako низа е null terminated всичко е ОК. Ако не, копираш го в масив от тип char с големина (endindex - startindex +1)
и добавяш #0 накрая и ползваш същата функция
и добавяш #0 накрая и ползваш същата функция
Re: Chetene na string ot PByte
var Count: DWORD;
...........................................................................
Count := EndIndex - StartIndex +1;
SetLength(Result, Count);
Move((PChar(FData)+StartIndex)^, Result[1], Count);
...........................................................................
Count := EndIndex - StartIndex +1;
SetLength(Result, Count);
Move((PChar(FData)+StartIndex)^, Result[1], Count);
Re: Chetene na string ot PByte
takmo se kaneh i az twa da napisha sled tonowete gluposti izpisani tuk :))
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]
(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]