Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2009.08.16;
Скачать: [xml.tar.bz2];

Вниз

Расчет контрольной суммы   Найти похожие ветки 

 
МистерТ   (2008-05-27 13:50) [0]

Здравствуйте.
Вопрос достаточно необычен, и надеюсь не ошибся конференцией.

Согласно протокола обмена с одной железкой необходимо в сообщении вписывать контрольную сумму. Но вот расчет самой суммы достаточно необычен.
Checksum Least significant byte of the sum of the other characters in
in hexadecimal characters (two characters, Start and Stop not
included in the sum)

Как я понял - контрольная сумма - это просто последний байт суммы всех байт в сообщении в HEX, без учета первого (Start) и второго (Stop) байт.
Снифером посмотрел, что отправляет фирменная утилита, для примера (13 - стартовый байт, 1A - стоповый):
13 03 30 33 1A 03 + 30 = 33 ОК
13 0C 30 43 1A 0C + 30 = 3C что не равно 43
13 01 52 30 33 35 45 42 1A 01 + 52 + 30 + 33 + 35 + 45 = 130 и как 130 превращается в 42 я понять не могу

Может кто сталкивался с подобными расчетами контрольных сумм или просто понял алгоритм и обхяснит мне где я не прав ?

Заранее спасибо за ответы.


 
Renegat   (2008-05-27 14:10) [1]

130h = 0000 0001 0011 0000b. Если обрубить "верхний" байт (равный 1) - выйдет 0011 0000b или 48d или 30h. Где тут 42 (или 43, по первому посту неясно)?


 
Renegat   (2008-05-27 14:22) [2]

а, туплю. 43 и 42 это разные вещи :)

кстати, 3Ch = 0011 1100b, 43h = 0100 0011b.
рискну предположить, что 43h это "почти" NOT 3Ch, только со сброшенным знаковым разрядом.
впрочем, если так считать третий пример, то таки получится всё равно не 43h, а 4Fh...


 
Anatoly Podgoretsky ©   (2008-05-27 14:29) [3]

> МистерТ  (27.05.2008 13:50:00)  [0]

А с чего ты решил, это СУММА байт?


 
МистерТ   (2008-05-27 14:32) [4]

> Anatoly Podgoretsky ©   (27.05.08 14:29) [3]
the sum of the other characters in hexadecimal characters
как я понял - это сумма символов в шестнадцатиричном представлении, я не правильно понял ?


 
МистерТ   (2008-05-27 14:45) [5]

Все-таки это оказалась сумма байт...только немного извращенно получаемая.
Перевел то я практически правильно, но вот надпись two characters относилась не к старт/стоповым байтам, а к количеству байт в контрольной сумме.
таким образом получается:
13 03 30 33 1A, отбрасываем 13 и 1А и два байта контрольной суммы, остается 03, а 30 и 33 это ноль и тройка в ASCII кодах.
далее
13 0C 30 43 1A, информационный байт - 0С, а 30 и 43 - это ноль и латинское С (цэ) опять таки в ASCII кодах.
13 01 52 30 33 35 45 42 1A 01, инормация
01 52 30 33 35, сумма байт в HEX будет ЕВ, соответственно 45 - Е в ASCII, а 42 - B в ASCII.
Более хитровывернутой контрольной суммы я еще не встречал...
Чем буду лечить вывих мозга, еще не решил :)


 
Anatoly Podgoretsky ©   (2008-05-27 14:58) [6]

> МистерТ  (27.05.2008 14:32:04)  [4]

Неправильно понял, сумма не означет сумму байт, это просто контрольная сумма, которая считается по определенному алгоритму. Анализ твоих кодов показывает, что это не сумма байтов, а сложнее.


 
МистерТ   (2008-05-27 15:25) [7]

> Anatoly Podgoretsky ©   (27.05.08 14:58) [6]
Хммм...буду думать.
К сожалению, кроме этого абзаца в документации ни чего не написано.
Плюсом идут пакеты, которые уже сам поймал снифером, сейчас попробовал проверить еще несколько, по найденному мной алгоритму, контрольные суммы пока сходятся. Попробую еще поэкспериментировать.
Спасибо за здоровый скепсис :) а то я уже обрадовался что победил эту заразу (железка вообще капризная).


 
Ega23 ©   (2008-05-27 15:32) [8]


// The constants here are for the CRC-32 generator
// polynomial, as defined in the Microsoft
// Systems Journal, March 1995, pp. 107 - 108

unit uCRC32;

interface

uses Windows, Classes;

const
 Table: array[0..255] of DWORD =
   ($00000000, $77073096, $EE0E612C, $990951BA,
   $076DC419, $706AF48F, $E963A535, $9E6495A3,
   $0EDB8832, $79DCB8A4, $E0D5E91E, $97D2D988,
   $09B64C2B, $7EB17CBD, $E7B82D07, $90BF1D91,
   $1DB71064, $6AB020F2, $F3B97148, $84BE41DE,
   $1ADAD47D, $6DDDE4EB, $F4D4B551, $83D385C7,
   $136C9856, $646BA8C0, $FD62F97A, $8A65C9EC,
   $14015C4F, $63066CD9, $FA0F3D63, $8D080DF5,
   $3B6E20C8, $4C69105E, $D56041E4, $A2677172,
   $3C03E4D1, $4B04D447, $D20D85FD, $A50AB56B,
   $35B5A8FA, $42B2986C, $DBBBC9D6, $ACBCF940,
   $32D86CE3, $45DF5C75, $DCD60DCF, $ABD13D59,
   $26D930AC, $51DE003A, $C8D75180, $BFD06116,
   $21B4F4B5, $56B3C423, $CFBA9599, $B8BDA50F,
   $2802B89E, $5F058808, $C60CD9B2, $B10BE924,
   $2F6F7C87, $58684C11, $C1611DAB, $B6662D3D,

   $76DC4190, $01DB7106, $98D220BC, $EFD5102A,
   $71B18589, $06B6B51F, $9FBFE4A5, $E8B8D433,
   $7807C9A2, $0F00F934, $9609A88E, $E10E9818,
   $7F6A0DBB, $086D3D2D, $91646C97, $E6635C01,
   $6B6B51F4, $1C6C6162, $856530D8, $F262004E,
   $6C0695ED, $1B01A57B, $8208F4C1, $F50FC457,
   $65B0D9C6, $12B7E950, $8BBEB8EA, $FCB9887C,
   $62DD1DDF, $15DA2D49, $8CD37CF3, $FBD44C65,
   $4DB26158, $3AB551CE, $A3BC0074, $D4BB30E2,
   $4ADFA541, $3DD895D7, $A4D1C46D, $D3D6F4FB,
   $4369E96A, $346ED9FC, $AD678846, $DA60B8D0,
   $44042D73, $33031DE5, $AA0A4C5F, $DD0D7CC9,
   $5005713C, $270241AA, $BE0B1010, $C90C2086,
   $5768B525, $206F85B3, $B966D409, $CE61E49F,
   $5EDEF90E, $29D9C998, $B0D09822, $C7D7A8B4,
   $59B33D17, $2EB40D81, $B7BD5C3B, $C0BA6CAD,

   $EDB88320, $9ABFB3B6, $03B6E20C, $74B1D29A,
   $EAD54739, $9DD277AF, $04DB2615, $73DC1683,
   $E3630B12, $94643B84, $0D6D6A3E, $7A6A5AA8,
   $E40ECF0B, $9309FF9D, $0A00AE27, $7D079EB1,
   $F00F9344, $8708A3D2, $1E01F268, $6906C2FE,
   $F762575D, $806567CB, $196C3671, $6E6B06E7,
   $FED41B76, $89D32BE0, $10DA7A5A, $67DD4ACC,
   $F9B9DF6F, $8EBEEFF9, $17B7BE43, $60B08ED5,
   $D6D6A3E8, $A1D1937E, $38D8C2C4, $4FDFF252,
   $D1BB67F1, $A6BC5767, $3FB506DD, $48B2364B,
   $D80D2BDA, $AF0A1B4C, $36034AF6, $41047A60,
   $DF60EFC3, $A867DF55, $316E8EEF, $4669BE79,
   $CB61B38C, $BC66831A, $256FD2A0, $5268E236,
   $CC0C7795, $BB0B4703, $220216B9, $5505262F,
   $C5BA3BBE, $B2BD0B28, $2BB45A92, $5CB36A04,
   $C2D7FFA7, $B5D0CF31, $2CD99E8B, $5BDEAE1D,

   $9B64C2B0, $EC63F226, $756AA39C, $026D930A,
   $9C0906A9, $EB0E363F, $72076785, $05005713,
   $95BF4A82, $E2B87A14, $7BB12BAE, $0CB61B38,
   $92D28E9B, $E5D5BE0D, $7CDCEFB7, $0BDBDF21,
   $86D3D2D4, $F1D4E242, $68DDB3F8, $1FDA836E,
   $81BE16CD, $F6B9265B, $6FB077E1, $18B74777,
   $88085AE6, $FF0F6A70, $66063BCA, $11010B5C,
   $8F659EFF, $F862AE69, $616BFFD3, $166CCF45,
   $A00AE278, $D70DD2EE, $4E048354, $3903B3C2,
   $A7672661, $D06016F7, $4969474D, $3E6E77DB,
   $AED16A4A, $D9D65ADC, $40DF0B66, $37D83BF0,
   $A9BCAE53, $DEBB9EC5, $47B2CF7F, $30B5FFE9,
   $BDBDF21C, $CABAC28A, $53B39330, $24B4A3A6,
   $BAD03605, $CDD70693, $54DE5729, $23D967BF,
   $B3667A2E, $C4614AB8, $5D681B02, $2A6F2B94,
   $B40BBE37, $C30C8EA1, $5A05DF1B, $2D02EF8D);

type
//----------------------------------crc32----------------------------------
 TInteger8 = Int64;

procedure CalcCRC32(p: Pointer; ByteCount: DWORD; var CRCValue: DWORD);
function CalcStringCRC32(s: string; out CRC32: DWORD): Boolean;
procedure CalcFileCRC32(FromName: string; var CRCvalue: DWORD; var TotalBytes: TInteger8; var error: Word);

implementation

 // Use CalcCRC32 as a procedure so CRCValue can be passed in but
 // also returned. This allows multiple calls to CalcCRC32 for
 // the "same" CRC-32 calculation.
procedure CalcCRC32(p: Pointer; ByteCount: DWORD; var CRCValue: DWORD);
 // The following is a little cryptic (but executes very quickly).
 // The algorithm is as follows:
 // 1. exclusive-or the input byte with the low-order byte of
 // the CRC register to get an INDEX
 // 2. shift the CRC register eight bits to the right
 // 3. exclusive-or the CRC register with the contents of Table[INDEX]
 // 4. repeat steps 1 through 3 for all bytes
var
 i: DWORD;
 q: ^BYTE;
begin
 q := p;
 for i := 0 to ByteCount - 1 do
 begin
   CRCvalue := (CRCvalue shr 8) xor
     Table[q^ xor (CRCvalue and $000000FF)];
   Inc(q)
 end
end {CalcCRC32};

function CalcStringCRC32(s: string; out CRC32: DWORD): Boolean;
var
 CRC32Table: DWORD;
begin
 Result := False;
 // Verify the table used to compute the CRCs has not been modified.
 // Thanks to Gary Williams for this suggestion, Jan. 2003.
 CRC32Table := $FFFFFFFF;
 CalcCRC32(Addr(Table[0]), SizeOf(Table), CRC32Table);
 CRC32Table := not CRC32Table;

 if CRC32Table <> $6FCF9E13 then //ShowMessage("CRC32 Table CRC32 is " +
     //IntToHex(Crc32Table, 8) +
     //", expecting $6FCF9E13")
 else
 begin
   CRC32 := $FFFFFFFF; // To match PKZIP
   if Length(s) > 0 then
   begin
     try
       CalcCRC32(Addr(s[1]), Length(s), CRC32);
       Result := True;
     except

     end;
   end;
   CRC32 := not CRC32; // To match PKZIP
 end;
end;

procedure CalcFileCRC32(FromName: string; var CRCvalue: DWORD;
 var TotalBytes: TInteger8;
 var error: Word);
var
 Stream: TMemoryStream;
begin
 error := 0;
 CRCValue := $FFFFFFFF;  
 Stream := TMemoryStream.Create;  
 try  
   try  
     Stream.LoadFromFile(FromName);  
     if Stream.Size > 0 then CalcCRC32(Stream.Memory, Stream.Size, CRCvalue)  
     except  
       on E: EReadError do  
         error := 1  
   end;  
   CRCvalue := not CRCvalue  
 finally  
   Stream.Free  
 end;  
end;

end.


 
Anatoly Podgoretsky ©   (2008-05-27 15:51) [9]


> контрольные суммы пока сходятся.

Если сходятся, то в чем проблема, считай, что решил.


 
Anatoly Podgoretsky ©   (2008-05-27 15:51) [10]


> CRC-32 generator

Это как то относится к 16 битным контрольным суммам?


 
DVM ©   (2008-05-27 17:07) [11]


> Ega23 ©   (27.05.08 15:32) [8]

CRC и CheckSum это не одно и то же, плюс вариантов расчета CRC существуют десятки, не говоря уже о СRС8/16/32/64.


 
DVM ©   (2008-05-27 17:18) [12]


> МистерТ   (27.05.08 13:50)

посмотри различные варианты подсчета в моем модуле, может какой подойдет

http://dvmuratov.narod.ru/crc.pas


 
DVM ©   (2008-05-27 17:21) [13]


> МистерТ   (27.05.08 13:50)

вот еще, но уже checksum

http://dvmuratov.narod.ru/Checksum.pas


 
TForumHelp ©   (2008-05-27 19:18) [14]

для файла я делал так:
function GetCheckSum(FileName : string) : DWORD;
var
 F : File of DWORD;
 P : Pointer;
 Fsize : DWORD;
 Buffer : Array [0..500] of DWORD;
begin  
 FileMode := 0;  
 AssignFile(F,FileName);  
 Reset(F);  
 Seek(F,FileSize(F) div 2);  
 Fsize := FileSize(F) -1 -FilePos(F);  
 if Fsize > 500 then
   Fsize := 500;

 BlockRead(F, Buffer, Fsize);
 Close (F);
 P := @Buffer;

 asm
   xor eax, eax
   xor ecx, ecx
   mov edi , p
   @again:
     add eax, [edi + 4*ecx]
     inc ecx
     cmp ecx, fsize
   jl @again
   mov @result, eax
 end;
end;


может чем поможет.


 
МистерТ   (2008-05-28 09:13) [15]

Всем большое спасибо.
Информацию я сохранил на будущее, вдруг пригодится, но вопрос был по конкретному описанию алгоритма из документации.
К сожалению оооочень много производителей изобретают свои методы расчет контрольных сумм вместо приведенных тут стандартных :(


 
DiamondShark ©   (2008-05-28 13:33) [16]


> Более хитровывернутой контрольной суммы я еще не встречал.

Чего хитровывернутого? Текстовая шестнадцатеричная запись байта, байт -- сумма всех байт пакета с отброшенным переносом.
Мне, например, такой метод попадался в протоколах трёх-четырёх моделей фискальных регистраторов и кассовых аппаратов.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2009.08.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.007 c
2-1245582008
Б
2009-06-21 15:00
2009.08.16
Найти доступ владения окном.


15-1245226088
Юрий
2009-06-17 12:08
2009.08.16
С днем рождения ! 17 июня 2009 среда


2-1245417227
iterator
2009-06-19 17:13
2009.08.16
Как обратиться к объекту?


1-1211793004
aidyn
2008-05-26 13:10
2009.08.16
20-значная цифра


15-1245045762
Knight
2009-06-15 10:02
2009.08.16
Помогите теорией. Полигон по направляющей полилинии.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский