Перейти к содержимому


Внимание!

Это форум по извлечению ресурсов из игр: музыки, звуков, текстур, 3D-моделей...
Перед поиском ответов на форуме, рекомендуется ознакомиться с основным сайтом EXTRACTOR.ru!
[ Прочтите внимательно - правила создания тем и ответа в них ]
Все вопросы по запуску игр задавайте в другом месте: Установка и запуск игр.


Фотография

алгоритм checksum8


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 9

#1 volodija

volodija

    Младший сержант

  • Пользователи
  • 18 сообщений

Отправлено 16 May 2011 - 15:13

расскажите как им пользоваться
вообщем есть сериник проги в прошивке в нем ,,этот байт есть противовес, возник по причини постоянной смены кода серийника,,
,,сумма считается по алгоритму checksum8, т.е. байты сумируются, все что выше FF откидывается,,

может есть такая прога которая его считает

#2 volodija

volodija

    Младший сержант

  • Пользователи
  • 18 сообщений

Отправлено 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
что я делаю не так >?

#3 -=CHE@TER=-

-=CHE@TER=-

    Полковник

  • Администраторы
  • 971 сообщений
  • Пол:Мужчина

Отправлено 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 volodija

volodija

    Младший сержант

  • Пользователи
  • 18 сообщений

Отправлено 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;

#5 -=CHE@TER=-

-=CHE@TER=-

    Полковник

  • Администраторы
  • 971 сообщений
  • Пол:Мужчина

Отправлено 26 May 2011 - 12:34

Чем мой код выше, который считает контрольную сумму от серийника, не устроил?

#6 volodija

volodija

    Младший сержант

  • Пользователи
  • 18 сообщений

Отправлено 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;

#7 volodija

volodija

    Младший сержант

  • Пользователи
  • 18 сообщений

Отправлено 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;

#8 volodija

volodija

    Младший сержант

  • Пользователи
  • 18 сообщений

Отправлено 30 May 2011 - 11:33

короче используй 8 бит на символ
вот что мне подсказали

#9 volodija

volodija

    Младший сержант

  • Пользователи
  • 18 сообщений

Отправлено 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-. $/+%

#10 volodija

volodija

    Младший сержант

  • Пользователи
  • 18 сообщений

Отправлено 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.