![]() |
|
حساب crc المجموع لاختباري 2 بايت - نسخة قابلة للطباعة +- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum) +-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3) +--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15) +--- الموضوع : حساب crc المجموع لاختباري 2 بايت (/showthread.php?tid=12211) |
حساب crc المجموع لاختباري 2 بايت - Team dz - 12-02-2023 السلام عليكم ورحمة الله اريد تعديل السورد كود لحساب قيمة شيك سوم 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 ممكن اي احد من لاعضاء او الفريق المطور له روح في حسابات يعدل لنا المثال وبرك الله فيه RE: حساب crc المجموع لاختباري 2 بايت - Ndagor - 18-02-2023 الدالة التي تقوم باعطاء النتائج غير معروفة ,,,كيف حسبت تلك القيم هل ممكن اعطاء اسم الخوارزمية,,, تلك القيم لايمكن الحصول عليها من الكود الذي ارسلته ,,,Table تخصcrc العادي تعطي 35E01A00 5A05 و الدالة CRC16تخص crc16 CCITT وتعطي نتيجة 58E5 انظر الى الرابط النتيجة الاولى و الرابعة https://crccalc.com/?crc=35E01A00&method=crc16&datatype=hex&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;RE: حساب crc المجموع لاختباري 2 بايت - Agmcz - 18-02-2023 السلام عليكم أخي سبق وطرحت موضوع مشابه. عموما دائما هناك غموض في تقوله بالتالي وصولك لنتيجة أمر صعب.. دعك من ذكر المصطلحات (المجموع الإختياري, Checksum...) المهم من أين عرفت أنت أن نتيجة حساب crc لـ 35E01A00 هو 4A16 إن كانت هذه النتجية تأتي بيها من تطبيق ما فيجب عليك عمل debug له وإستخلاص ما يفعله... غير ذلك وضح أكثر... RE: حساب crc المجموع لاختباري 2 بايت - Team dz - 18-02-2023 شكرا لك اخي علا الرد ولاجابة لكن النتيجة مختلفة |