алгоритм checksum8
Автор
volodija
, May 16 2011 15:13
Сообщений в теме: 9
#1
Отправлено 16 May 2011 - 15:13
расскажите как им пользоваться
вообщем есть сериник проги в прошивке в нем ,,этот байт есть противовес, возник по причини постоянной смены кода серийника,,
,,сумма считается по алгоритму checksum8, т.е. байты сумируются, все что выше FF откидывается,,
может есть такая прога которая его считает
вообщем есть сериник проги в прошивке в нем ,,этот байт есть противовес, возник по причини постоянной смены кода серийника,,
,,сумма считается по алгоритму checksum8, т.е. байты сумируются, все что выше FF откидывается,,
может есть такая прога которая его считает
#2
Отправлено 23 May 2011 - 13:02
function CheckSumZ5IGBFAZ900105Yv(S: String): byte;
var i,b,k: byte;
begin
b:=0;
for i:=1 to LengthZ5IGBFAZ900105Yv do
b:=b+byte(S[i]);
for i:=0 to 255 do
begin
k:=b+i;
if k=$40 then break;
end;
result:=i;
end;
серийник Z5IGBFAZ900105Y байт после серийника v
что я делаю не так >?
var i,b,k: byte;
begin
b:=0;
for i:=1 to LengthZ5IGBFAZ900105Yv do
b:=b+byte(S[i]);
for i:=0 to 255 do
begin
k:=b+i;
if k=$40 then break;
end;
result:=i;
end;
серийник Z5IGBFAZ900105Y байт после серийника v
что я делаю не так >?
#3
Отправлено 23 May 2011 - 13:30
Program chksum8; {$APPTYPE CONSOLE} function CheckSum8(s: string): byte; var i, b, k: byte; begin b:=0; for i:=1 to Length(S) do b:=b + ord(s[i]); for i:=0 to 255 do begin k:=b + i; if k = $40 then break; end; result:=i; end; begin writeln(chr(CheckSum8('Z5IGBFAZ900105Y'))); // v end.
#4
Отправлено 25 May 2011 - 15:19
function TForm1.TestSN(S: String): boolean;
Var B: boolean;
Begin
if Length(S)<>15
then Begin
Result:=False;
Exit;
End;
B:=True;
B:=B And (S[1]='Z') And (S[2]='5') And (S[5]='B') And (S[6]='F');
B:=B And (S[10] in ['0'..'9']) And (S[11] in ['0'..'9']) And (S[12] in ['0'..'9']);
B:=B And (S[13] in ['0'..'9']) And (S[14] in ['0'..'9']);
B:=B And (S[15] in ['A'..'Z']);
Result:=B;
End;
Function NormSN(SN: String): String;
Begin
While Pos(' ',SN)<>0 do
delete(SN,Pos(' ',SN),1);
if Length(SN)>15
then SetLength(SN,LengthSN);
result:=SN;
End;
Вызов таким вот макаром:
SN:=NormSN(Edit1.Text);
if Not TestSN(SN)
then Begin
ShowMessage('SN "'+SN+'" не соответствует формату');
Exit;
End;
Проверка SN на правильность. Спасёт от неправильно ввода SN
вот SN Z5IGBFAZ900105Y байт после серийника v
еще сказали что надо
Насколько я понял, после SN идёт контрольный байт. Один байт, а не 2. checksum8(SN+этот байт) должно быть 40h. Это скорее всего защита от подделки SN. Если меняем SN, а контрольный байт оставляем старый то checksum уже не будет равен 40, и работать не будет
вот еще что сказали что надо прогнать алгоритм
прежде чем считывать контрольную сумму
type
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
function TestSN(S: String): boolean;
function ChecksumSN(S: String): byte;
Procedure hz(hdFile,Yadro: TMemoryStream;S: String);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
hdFileUPD,hdFileNoUPD,YadroUPD,YadroNoUPD: TMemoryStream;
const LengthSN: Byte = 15;
bgYadro: Integer = 262276;
Var B: boolean;
Begin
if Length(S)<>15
then Begin
Result:=False;
Exit;
End;
B:=True;
B:=B And (S[1]='Z') And (S[2]='5') And (S[5]='B') And (S[6]='F');
B:=B And (S[10] in ['0'..'9']) And (S[11] in ['0'..'9']) And (S[12] in ['0'..'9']);
B:=B And (S[13] in ['0'..'9']) And (S[14] in ['0'..'9']);
B:=B And (S[15] in ['A'..'Z']);
Result:=B;
End;
Function NormSN(SN: String): String;
Begin
While Pos(' ',SN)<>0 do
delete(SN,Pos(' ',SN),1);
if Length(SN)>15
then SetLength(SN,LengthSN);
result:=SN;
End;
Вызов таким вот макаром:
SN:=NormSN(Edit1.Text);
if Not TestSN(SN)
then Begin
ShowMessage('SN "'+SN+'" не соответствует формату');
Exit;
End;
Проверка SN на правильность. Спасёт от неправильно ввода SN
вот SN Z5IGBFAZ900105Y байт после серийника v
еще сказали что надо
Насколько я понял, после SN идёт контрольный байт. Один байт, а не 2. checksum8(SN+этот байт) должно быть 40h. Это скорее всего защита от подделки SN. Если меняем SN, а контрольный байт оставляем старый то checksum уже не будет равен 40, и работать не будет
вот еще что сказали что надо прогнать алгоритм
прежде чем считывать контрольную сумму
type
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
function TestSN(S: String): boolean;
function ChecksumSN(S: String): byte;
Procedure hz(hdFile,Yadro: TMemoryStream;S: String);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
hdFileUPD,hdFileNoUPD,YadroUPD,YadroNoUPD: TMemoryStream;
const LengthSN: Byte = 15;
bgYadro: Integer = 262276;
#5
Отправлено 26 May 2011 - 12:34
Чем мой код выше, который считает контрольную сумму от серийника, не устроил?
#6
Отправлено 26 May 2011 - 14:53
Да устроил!Спасибо только там вроде еще до этого кода надо пройти проверку алгоритма и только после этого надо чексумм считать
проверка по вот этому коду но он еще не весь по мойму
type
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
function TestSN(S: String): boolean;
function ChecksumSN(S: String): byte;
Procedure hz(hdFile,Yadro: TMemoryStream;S: String);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
hdFileUPD,hdFileNoUPD,YadroUPD,YadroNoUPD: TMemoryStream;
const LengthSN: Byte = 15;
проверка по вот этому коду но он еще не весь по мойму
type
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
function TestSN(S: String): boolean;
function ChecksumSN(S: String): byte;
Procedure hz(hdFile,Yadro: TMemoryStream;S: String);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
hdFileUPD,hdFileNoUPD,YadroUPD,YadroNoUPD: TMemoryStream;
const LengthSN: Byte = 15;
#7
Отправлено 28 May 2011 - 11:34
function CheckSum8(s: string): byte;
var i, b, k: byte;
begin
b:=0;
for i:=1 to Length(S) do b:=b + byte(s[i]); {При сложении точно не будет приведения типов и переполнение сброситься}
for i:=0 to 255 do
begin
k:=b + i;
if k = $40 then break;
end;
result:=i;
end;
var i, b, k: byte;
begin
b:=0;
for i:=1 to Length(S) do b:=b + byte(s[i]); {При сложении точно не будет приведения типов и переполнение сброситься}
for i:=0 to 255 do
begin
k:=b + i;
if k = $40 then break;
end;
result:=i;
end;
#8
Отправлено 30 May 2011 - 11:33
короче используй 8 бит на символ
вот что мне подсказали
вот что мне подсказали
#9
Отправлено 30 May 2011 - 11:35
вот еще
const LengthSN: Byte = 15; // Длинна SN
function TestAndNorm(S: String): String;
var
i,k: Integer;
t: String;
begin
Result:='';
i:=1;k:=1;
while i<=Length(S) do // Основной цикл
begin
if S[i]<>' ' then // Пробелы пропускаем
begin
t:=t+(S[i]); // Преобразуем к верхнему регистру
case k of // Проверка валидности серийника
1: if t[k]<>'Z' then Exit;
2: if t[k]<>'5' then Exit;
5: if t[k]<>'B' then Exit;
6: if t[k]<>'F' then Exit;
10..14: if not(t[k] in ['0'..'9']) then Exit;
15: if not(t[k] in ['A'..'Z']) then Exit;
end;
k:=k+1;
end;
i:=i+1;
end;
if Length(t)<>LengthSN then Exit; // Проверка длины серийника
Result:=t; // Если все ОК, то t - нормальный серийник
end;
end.
вот еще
использует Code39 в облегченном варианте (без контрольного символа) для серийников, отсюда проверку можно сделать только по символам в такой-то позиции такой в такой-то такой и так далее. но в сам штрих-код можно закодировать что угодно, любые из символов
Код: выделить все
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%
const LengthSN: Byte = 15; // Длинна SN
function TestAndNorm(S: String): String;
var
i,k: Integer;
t: String;
begin
Result:='';
i:=1;k:=1;
while i<=Length(S) do // Основной цикл
begin
if S[i]<>' ' then // Пробелы пропускаем
begin
t:=t+(S[i]); // Преобразуем к верхнему регистру
case k of // Проверка валидности серийника
1: if t[k]<>'Z' then Exit;
2: if t[k]<>'5' then Exit;
5: if t[k]<>'B' then Exit;
6: if t[k]<>'F' then Exit;
10..14: if not(t[k] in ['0'..'9']) then Exit;
15: if not(t[k] in ['A'..'Z']) then Exit;
end;
k:=k+1;
end;
i:=i+1;
end;
if Length(t)<>LengthSN then Exit; // Проверка длины серийника
Result:=t; // Если все ОК, то t - нормальный серийник
end;
end.
вот еще
использует Code39 в облегченном варианте (без контрольного символа) для серийников, отсюда проверку можно сделать только по символам в такой-то позиции такой в такой-то такой и так далее. но в сам штрих-код можно закодировать что угодно, любые из символов
Код: выделить все
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%
#10
Отправлено 01 June 2011 - 15:26
program Project1;
const LengthSN: Byte = 15;
function TestAndNorm(S: String): String;
var
i,k: Integer;
t: String;
begin
TestAndNorm:='';
t:='';
i:=1;k:=1;
while i<=Length(S) do
begin
if S[i]<>' ' then
begin
t:=t+UpCase(S[i]);
case k of
1: if t[k]<>'Z' then Exit;
2: if t[k]<>'5' then Exit;
5: if t[k]<>'B' then Exit;
6: if t[k]<>'F' then Exit;
10..14: if not(t[k] in ['0'..'9']) then Exit;
15: if not(t[k] in ['A'..'Z']) then Exit;
end;
k:=k+1;
end;
i:=i+1;
end;
if Length(t)<>LengthSN then Exit;
TestAndNorm:=t;
end;
const
s1='Z5IGBFAZ900105Y';
begin
WriteLn(s1,' -> ',TestAndNorm(s1));
ReadLn;
end.
const LengthSN: Byte = 15;
function TestAndNorm(S: String): String;
var
i,k: Integer;
t: String;
begin
TestAndNorm:='';
t:='';
i:=1;k:=1;
while i<=Length(S) do
begin
if S[i]<>' ' then
begin
t:=t+UpCase(S[i]);
case k of
1: if t[k]<>'Z' then Exit;
2: if t[k]<>'5' then Exit;
5: if t[k]<>'B' then Exit;
6: if t[k]<>'F' then Exit;
10..14: if not(t[k] in ['0'..'9']) then Exit;
15: if not(t[k] in ['A'..'Z']) then Exit;
end;
k:=k+1;
end;
i:=i+1;
end;
if Length(t)<>LengthSN then Exit;
TestAndNorm:=t;
end;
const
s1='Z5IGBFAZ900105Y';
begin
WriteLn(s1,' -> ',TestAndNorm(s1));
ReadLn;
end.