2013-02-11 44 views
6

मैं एक रिकॉर्ड है कि कई बाइट्स/बाइट्स की सरणियों शामिल है:डेल्फी: रिकॉर्ड में बाइट्स के माध्यम से लूप

type 
    TRdmPacket = record 
    sc: byte; 
    subSc: byte; 
    msgLength: byte; 
    destUID: array[0..5] of byte; 
    srcUID: array[0..5] of byte; 
    transNum: byte; 
    portID: byte; 
    msgCount: byte; 
    subDevice: array[0..1] of byte; 
    cc: byte; 
    pid: array[0..1] of byte; 
    pdl: byte; 
    end; 

मैं इस प्रकार के एक भी रिकॉर्ड है और मैं अंदर बाइट्स से अधिक पाश की जरूरत है (बनाने के लिए चेकसम पर प्रत्येक बाइट जोड़कर एक सरल चेकसम)। क्या लूप में ऐसा करने का कोई आसान तरीका है या क्या मुझे रिकॉर्ड के अंदर प्रत्येक तत्व को व्यक्तिगत रूप से जाना होगा?

उत्तर

8

आप की तरह कुछ कर सकते हैं:

var 
    sum: Byte; 
    ptr: PByte; 
    i: Integer; 
begin 
    sum := 0; 
    ptr := PByte(@rdmPacket); 

    for i := 0 to SizeOf(TRdmPacket) - 1 do 
    begin 
    sum := sum xor ptr^; 
    Inc(ptr); 
    end; 
end; 

इस विशेष मामले में, यह सही ढंग से काम क्योंकि TRdmPacket में सभी क्षेत्रों बाइट या बाइट्स की सरणियों हैं और वे गठबंधन न दिया जाए। यदि आप इस विधि का उपयोग अन्य प्रकार के रिकॉर्ड के लिए करना चाहते हैं तो आगे पढ़ें Packed और $Align directive आंतरिक रिकॉर्ड लेआउट को प्रभावित करता है।

+1

के लिए पूर्ण निर्देश उपयोग कर सकते हैं कि ऐसा होता है, इस रिकॉर्ड में हर क्षेत्र संरेखण 1 है और इसलिए अपने लेआउट में एक ही जैसे कि यह पैक किया गया होगा। आप संरेखण के संबंध में एक बहुत अच्छा मुद्दा बनाते हैं, यह यहां महत्वपूर्ण है। –

+0

संरेखण कोई फर्क नहीं पड़ता कि सभी फ़ील्ड बाइट्स या बाइट एरे हैं – kludg

+0

वास्तव में तेज़ सहायता के लिए धन्यवाद, बहुत अच्छा काम किया। – user2060821

2

आप इस

type 
    TRdmPacket = record 
    sc: byte; 
    subSc: byte; 
    msgLength: byte; 
    destUID: array[0..5] of byte; 
    srcUID: array[0..5] of byte; 
    transNum: byte; 
    portID: byte; 
    msgCount: byte; 
    subDevice: array[0..1] of byte; 
    cc: byte; 
    pid: array[0..1] of byte; 
    pdl: byte; 
    end; 

Function GetPackChecksum(pack:TRdmPacket):Integer; 
var 
BArray:Array [0..SizeOf(TRdmPacket) - 1] of Byte absolute pack; 
i:Integer; 
begin 
Result := 0; 
for I := Low (BArray)to High(BArray) do 
    begin 
     Result := Result + BArray[i]; 
    end; 

end; 

procedure TForm2.Button1Click(Sender: TObject); 
var 
pack:TRdmPacket; 
begin 
    ZeroMemory(@pack,SizeOf(Pack)); 
    pack.sc := 100; 
    pack.destUID[1] := 123; 
    Showmessage(IntToStr(GetPackChecksum(pack))); 
end;