حساب crc المجموع لاختباري 2 بايت
#1
السلام عليكم ورحمة الله 

اريد تعديل السورد كود  لحساب قيمة شيك سوم   Checksum

حساب Checksumالمجموع لاختباري  2 بايت


كود :
const Table: Array[0..255] of Word =      ($0000,$C0C1,$C181,$0140,$C301,$03C0,$0280,$C241,$C601,$06C0,$0780,       $C741,$0500,$C5C1,$C481,$0440,$CC01,$0CC0,$0D80,$CD41,$0F00,$CFC1,       $CE81,$0E40,$0A00,$CAC1,$CB81,$0B40,$C901,$09C0,$0880,$C841,$D801,       $18C0,$1980,$D941,$1B00,$DBC1,$DA81,$1A40,$1E00,$DEC1,$DF81,$1F40,       $DD01,$1DC0,$1C80,$DC41,$1400,$D4C1,$D581,$1540,$D701,$17C0,$1680,       $D641,$D201,$12C0,$1380,$D341,$1100,$D1C1,$D081,$1040,$F001,$30C0,       $3180,$F141,$3300,$F3C1,$F281,$3240,$3600,$F6C1,$F781,$3740,$F501,       $35C0,$3480,$F441,$3C00,$FCC1,$FD81,$3D40,$FF01,$3FC0,$3E80,$FE41,       $FA01,$3AC0,$3B80,$FB41,$3900,$F9C1,$F881,$3840,$2800,$E8C1,$E981,       $2940,$EB01,$2BC0,$2A80,$EA41,$EE01,$2EC0,$2F80,$EF41,$2D00,$EDC1,       $EC81,$2C40,$E401,$24C0,$2580,$E541,$2700,$E7C1,$E681,$2640,$2200,       $E2C1,$E381,$2340,$E101,$21C0,$2080,$E041,$A001,$60C0,$6180,$A141,       $6300,$A3C1,$A281,$6240,$6600,$A6C1,$A781,$6740,$A501,$65C0,$6480,       $A441,$6C00,$ACC1,$AD81,$6D40,$AF01,$6FC0,$6E80,$AE41,$AA01,$6AC0,       $6B80,$AB41,$6900,$A9C1,$A881,$6840,$7800,$B8C1,$B981,$7940,$BB01,       $7BC0,$7A80,$BA41,$BE01,$7EC0,$7F80,$BF41,$7D00,$BDC1,$BC81,$7C40,       $B401,$74C0,$7580,$B541,$7700,$B7C1,$B681,$7640,$7200,$B2C1,$B381,       $7340,$B101,$71C0,$7080,$B041,$5000,$90C1,$9181,$5140,$9301,$53C0,       $5280,$9241,$9601,$56C0,$5780,$9741,$5500,$95C1,$9481,$5440,$9C01,       $5CC0,$5D80,$9D41,$5F00,$9FC1,$9E81,$5E40,$5A00,$9AC1,$9B81,$5B40,       $9901,$59C0,$5880,$9841,$8801,$48C0,$4980,$8941,$4B00,$8BC1,$8A81,       $4A40,$4E00,$8EC1,$8F81,$4F40,$8D01,$4DC0,$4C80,$8C41,$4400,$84C1,       $8581,$4540,$8701,$47C0,$4680,$8641,$8201,$42C0,$4380,$8341,$4100,       $81C1,$8081,$4040);


كود :
function CRC16(bytes: array of Byte): Word; const   polynomial = $1021; var   crc: Word;   I, J: Integer;   b: Byte;   bit, c15: Boolean; begin   crc := $FFFF;   for I := 0 to High(bytes) do   begin     b := bytes[I];     for J := 0 to 7 do     begin       bit := (((b shr (7-J)) and 1) = 1);       c15 := (((crc shr 15) and 1) = 1);       crc := crc shl 1;       if ((c15 xor bit) <> false) then crc := crc xor polynomial;     end;   end;   Result := crc and $ffff; end;





كود :
procedure TForm1.Button1Click(Sender: TObject); VAR     CRC: word; begin label1.Caption:=inttohex(Crc(HexToString(Edit1.Text), $1021, 0),4); end;

اضن ان الخطاء في كود لاستغلال  

كود :
label1.Caption:=inttohex(Crc(HexToString(Edit1.Text), $1021, 0),4);




هذه بعض القيم لتوضيح كيف تحسب الدالة او الخورزمية للتوضيح  2 بايت علا يسيار بلون احمر    Checksum  

ولون اسود    بايت 


4ED8FFFFFFFF
4F4C00000000
8E8C00000001
CE8D00000002
0F4D00000003
4E8F00000004
8F4F00000005
CF4E00000006
0E8E00000007
4E8A00000008
8F4A00000009
CF4B0000000A
0E8B0000000B
4F490000000C
8E890000000D
CE880000000E
0F480000000
4E8000000010
8F4000000011


4A1635E01A00

القيمة الملونة  باللون لاحمر هي  مجموع   Checksumلي  4 بايت   35E01A00     

ممكن اي احد من لاعضاء  او الفريق المطور  له روح في حسابات يعدل لنا المثال وبرك الله فيه


الملفات المرفقة
.rar   test.rar (الحجم : 5.71 ك ب / التحميلات : 13)
الرد
#2
الدالة التي تقوم باعطاء النتائج غير معروفة ,,,كيف حسبت تلك القيم هل ممكن اعطاء اسم الخوارزمية,,,
تلك القيم لايمكن الحصول عليها من الكود الذي ارسلته ,,,Table تخصcrc  العادي تعطي 35E01A00 5A05
و الدالة CRC16تخص crc16 CCITT وتعطي نتيجة 58E5

انظر الى الرابط النتيجة الاولى و الرابعة
https://crccalc.com/?crc=35E01A00&method...&outtype=0

تصحيح الكود

كود :
const Table: Array[0..255] of Word =     ($0000,$C0C1,$C181,$0140,$C301,$03C0,$0280,$C241,$C601,$06C0,$0780,       $C741,$0500,$C5C1,$C481,$0440,$CC01,$0CC0,$0D80,$CD41,$0F00,$CFC1,       $CE81,$0E40,$0A00,$CAC1,$CB81,$0B40,$C901,$09C0,$0880,$C841,$D801,       $18C0,$1980,$D941,$1B00,$DBC1,$DA81,$1A40,$1E00,$DEC1,$DF81,$1F40,       $DD01,$1DC0,$1C80,$DC41,$1400,$D4C1,$D581,$1540,$D701,$17C0,$1680,       $D641,$D201,$12C0,$1380,$D341,$1100,$D1C1,$D081,$1040,$F001,$30C0,       $3180,$F141,$3300,$F3C1,$F281,$3240,$3600,$F6C1,$F781,$3740,$F501,       $35C0,$3480,$F441,$3C00,$FCC1,$FD81,$3D40,$FF01,$3FC0,$3E80,$FE41,       $FA01,$3AC0,$3B80,$FB41,$3900,$F9C1,$F881,$3840,$2800,$E8C1,$E981,       $2940,$EB01,$2BC0,$2A80,$EA41,$EE01,$2EC0,$2F80,$EF41,$2D00,$EDC1,       $EC81,$2C40,$E401,$24C0,$2580,$E541,$2700,$E7C1,$E681,$2640,$2200,       $E2C1,$E381,$2340,$E101,$21C0,$2080,$E041,$A001,$60C0,$6180,$A141,       $6300,$A3C1,$A281,$6240,$6600,$A6C1,$A781,$6740,$A501,$65C0,$6480,       $A441,$6C00,$ACC1,$AD81,$6D40,$AF01,$6FC0,$6E80,$AE41,$AA01,$6AC0,       $6B80,$AB41,$6900,$A9C1,$A881,$6840,$7800,$B8C1,$B981,$7940,$BB01,       $7BC0,$7A80,$BA41,$BE01,$7EC0,$7F80,$BF41,$7D00,$BDC1,$BC81,$7C40,       $B401,$74C0,$7580,$B541,$7700,$B7C1,$B681,$7640,$7200,$B2C1,$B381,       $7340,$B101,$71C0,$7080,$B041,$5000,$90C1,$9181,$5140,$9301,$53C0,       $5280,$9241,$9601,$56C0,$5780,$9741,$5500,$95C1,$9481,$5440,$9C01,       $5CC0,$5D80,$9D41,$5F00,$9FC1,$9E81,$5E40,$5A00,$9AC1,$9B81,$5B40,       $9901,$59C0,$5880,$9841,$8801,$48C0,$4980,$8941,$4B00,$8BC1,$8A81,       $4A40,$4E00,$8EC1,$8F81,$4F40,$8D01,$4DC0,$4C80,$8C41,$4400,$84C1,       $8581,$4540,$8701,$47C0,$4680,$8641,$8201,$42C0,$4380,$8341,$4100,       $81C1,$8081,$4040); function crc16CCITT(bytes: array of Byte):word; const   polynomial = $1021; var   crc: Word;   I, J: Integer;   b: Byte;   bit, c15: Boolean; begin   crc := $FFFF;   for I := 0 to High(bytes) do   begin     b := bytes[I];     for J := 0 to 7 do     begin       bit := Odd(b shr (7-J));       c15 := Odd(crc shr 15);       crc := word(crc shl 1);       if (c15 xor bit) <> false then         crc := crc xor polynomial;     end;   end;   Result := crc; end; function crc16(bytes: array of Byte):Word; // crc normal var   I :integer; begin   Result:= 0;   for I := 0 to Length(bytes)-1 do     Result := (Result shr 8) xor Table[bytes[I] xor (Result and $FF)]; end;

يمكنك تجريب احدى الدالتين crc16CCITT او crc16  سوف تقوم بحساب النتائج التي كما تم ذكرها ,,,الداله HexToArray موجودة في الامثلة السابقة ابحث عنها و اظفها الى الكود

كود :
procedure TForm1.Button1Click(Sender: TObject); var   c:word; begin c := crc16CCITT(HexToArray(Edit1.Text));  // c := crc16(HexToArray(Edit1.Text)); label1.Caption:= IntToHex(c,4); end;
الرد
#3
السلام عليكم
أخي سبق وطرحت موضوع مشابه.
عموما دائما هناك غموض في تقوله بالتالي وصولك لنتيجة أمر صعب..

دعك من ذكر المصطلحات (المجموع الإختياري, Checksum...)

المهم من أين عرفت أنت أن نتيجة حساب crc لـ 35E01A00 هو 4A16

إن كانت هذه النتجية تأتي بيها من تطبيق ما فيجب عليك عمل debug له وإستخلاص ما يفعله...
غير ذلك وضح أكثر...
سبحان الله وبحمده سبحان الله العظيم
الرد
#4
شكرا لك اخي علا الرد ولاجابة لكن النتيجة مختلفة
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم