2011-02-10 10 views
5
var 
    FileBuff: TBytes; 
    Pattern: TBytes; 
begin 
    FileBuff := filetobytes(filename); 
    Result := CompareMem(@Pattern[0], @FileBuff[0], Length(Pattern)); 
end; 

वहाँ किसी भी समारोह में इस तरह केक्या बाइट्स खोजने के लिए कोई "Pos" फ़ंक्शन है?

Result := Pos(@Pattern[0], @FileBuff[0]); 
+3

स्थिति, द्विआधारी सुरक्षित है AnsiChar की सरणियों के साथ यह फ़ीड और देखा, काम करता है –

+0

तुम भी एक में रुचि हो सकती बाइट्स के लिए स्ट्रिंगरियलेस फ़ंक्शन: http://stackoverflow.com/questions/3106139/binary-version-of-stringreplace –

उत्तर

7

मैं इस यह करता है लगता है:

function BytePos(const Pattern: TBytes; const Buffer: PByte; const BufLen: cardinal): PByte; 
var 
    PatternLength: cardinal; 
    i: cardinal; 
    j: cardinal; 
    OK: boolean; 
begin 
    result := nil; 
    PatternLength := length(Pattern); 
    if PatternLength > BufLen then Exit; 
    if PatternLength = 0 then Exit(Buffer); 
    for i := 0 to BufLen - PatternLength do 
    if PByte(Buffer + i)^ = Pattern[0] then 
    begin 
     OK := true; 
     for j := 1 to PatternLength - 1 do 
     if PByte(Buffer + i + j)^ <> Pattern[j] then 
     begin 
      OK := false; 
      break 
     end; 
     if OK then 
     Exit(Buffer + i); 
    end; 
end; 
+0

मैं pbyte के बजाय औपचारिक पैरामीटर का उपयोग करूंगा। इसका मतलब है, लेकिन अधिक प्रकार के साथ संगत। –

+0

@ एंड्रियास, मुझे लगता है कि यह ऐसा नहीं करता है: यदि पैटर्न नहीं मिला है, तो आपका दिनचर्या पहले बाइट में पॉइंटर वापस कर देगा ... यदि पैटर्न पहले बाइट में पाया जाता है तो आप कैसे अंतर करेंगे? यदि पैटर्न नहीं मिला है तो बेहतर वापसी शून्य। यदि पैटर्न मिलान का पहला और दूसरा बाइट, आपका दिनचर्या उस दूसरे बाइट का पता देता है और बाहर निकलता है (शेष पैटर्न की तुलना करने के बिना) – jachguate

+0

@jachguate: मैंने अभी देखा है। –

0

के रूप में अपने स्वयं के लिखें है। केवल एक बाइट की तलाश करते समय कोई अनुकूलन नहीं किया जा सकता है, इसलिए आपको जो भी कार्यान्वयन मिलेगा वह मूल रूप से वही काम करेगा।

ब्राउज़र में लिखा:

function BytePos(Pattern:Byte; Buffer:PByte; BufferSize:Integer): Integer; 
var i:Integer; 
begin 
    for i:=0 to BufferSize-1 do 
    if Buffer[i] = Pattern then 
    begin 
     Result := i; 
     Exit; 
    end; 
    Result := -1; 
end; 
+1

मुझे लगता है कि @user बहु-बाइट पैटर्न की क्षमता चाहता है –

+0

हाँ आपको केवल एक बाइट पैटर्न मिलता है, और आवश्यकता बहु- बाइट। –

+1

डाउन-वोट थोड़ा सा मतलब था! यह पहले से ही नीचे था! –

संबंधित मुद्दे