bonjour je suis en train décoder un fichier
j'ai u algorithme mais je ne sais comment traduire sa en delphi
formule ci dessous
merci pour votre aide
on est code que sur un seul byte
Pièce jointe 291206
Version imprimable
bonjour je suis en train décoder un fichier
j'ai u algorithme mais je ne sais comment traduire sa en delphi
formule ci dessous
merci pour votre aide
on est code que sur un seul byte
Pièce jointe 291206
bonjour
je fais sa mais sa marche pas
Code:
1
2
3
4
5
6
7
8
9
10
11
12 function decode(d:byte):byte; var a,b,p:byte; begin a:=(d+$FF)and $FF ; b:=a xor $88 ; p:= (b and $7E) or (b shr 7 and $01) or (b shl 7 and $80) ; result:=p; end;
Bonjour Tintin
Chez moi (Delphi 10.2 Starter), intégrée dans un programme mini (sans vérification d'erreur de saisie :!: ) ta fonction fonctionne parfaitement.
Trois valeurs testées par la fonction et à la main (entrée et sortie en hexa, les étapes intermédiaires en binaire):Code:
1
2
3
4
5
6
7
8 procedure TForm1.Button1Click(Sender: TObject); var num : Byte; begin num := StrToUInt('0x'+edit1.Text); num := decode(num); label1.Caption := format('%X', [num]); end;
00h -> 0000'0000b -> 1111'1111b -> 0111'0111b -> 1111'0110b -> F6h
7Eh -> 0111'1110b -> 0111'1101b -> 1111'0101b -> 1111'0101b -> F5h
FFh -> 1111'1111b -> 1111'1110b -> 0111'0110b -> 0111'0110b -> 76h
Delias
bonjour
merci pour la réponse
donc quelque chose ne vas pas car j'ai pas les bons résultats
donc je continu a chercher
merci
++
bonjour
voici la page que j'ai trouve pour décoder le fichier
exemple $98 doit retourner 53 en décimal
$CC 40 en décimal
pour $98 je suis sur que 53 car je l'ai essaye
merci
lien ci dessous
https://stefan.schuermans.info/rdcam/pc_conn.html
bonjour
je fais sa pour faire un post pro
gcode iso en code laser
merci
Bonsoir Tintin
98h ->(h->b) 1001'1000b ->(-1) 1001'0111b ->(xor) 0001'1111b ->(bit swap) 1001'1110b ->(b->h) 9Eh ->(h->d) 158d et c'est ce que mon programme trouve. CQFD
Donc le problème c'est soit le magic number qui n'est pas le bon, soit la procédure qui est fausse.
Pas trop motivé de chercher où est la différence qui fait qu'avec 98h on obtient 53d.
Delias
bonjour
adresse du logiciel pour essayer
http://en.rd-acs.com/down.aspx?pageindex=6
++
bonjour
petite rectification
$98=50decimal
$B0=53decimal
+++
Bonjour,
pardon mais
je ne comprends pas $98 pour moi à toujours fait 152 en décimal il faut certainement comprendre $98 devrait fournir après décodage $30 (soit 50 en base décimale) ?Citation:
$98=50decimal
$B0=53decimal
de plus quelque chose me choque :
avec une calculatriceCitation:
Step 1 : subtract 1 with wrap-around a:=(d +$FF) and $FF ;
$98+$FF donne $197 et non $97 << je pense que c'est un des problèmes ce qui dépasse l'octet n'est pas enlevé
pour $98+$FF il est facile de changer par $98-1
pour le reste je n'ai pas vérifié
Bonjour à tous
@Sergio:
Les trois écritures donnent exactement le même résultat:
Car a et d sont des Bytes, des entiers sur 8 bits non signé, donc il y a automatiquement un modulo 256 lors du débordement avec les opérations d'addition et de soustraction. L'ajout du and $FF équivalent à un modulo 256 inutile montre juste une méconnaissance de l’arithmétique des processeurs. Mais bon cela marche aussi avec, donc j'ai pas voulu embrouiller avec cela (car en plus ce n'est pas la seule optimisation à faire).Code:
1
2
3 a := (d+$FF) and $FF; a := d+$FF; a := d-1;
@Tintin:
Soit la procédure de décryptage est publiée par le fabricant, et ce n'est pas moi qui vais me taper les 30 pdf du lien pour la trouver. Soit la procédure n'est pas communiquée par le fabricant en temps que méthode (légère) de protection contre l'utilisation d'un logiciel tiers et dès lors ta demande relève du piratage (cf les règles du forum) et dans ce cas la discussion s'arrête ici.
Petite aparté:
Si la fonction est bien la succession de trois transformations, il faut au minimum 3 paires de valeurs d'entrée/sortie, sinon elle sera indéfinie.
Il reste également la possibilité d'utiliser une table de mappage:
Reste plus qu'a remplir les 254 autres cases sans se tromper :aie:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 function decode(d:byte):byte; const // x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF map: array[0..255] of Byte = ($00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, //0x $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, //1x $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, //2x $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, //3x $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, //4x $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, //5x $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, //6x $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, //7x $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, //8x $00, $00, $00, $00, $00, $00, $00, $00, 50, $00, $00, $00, $00, $00, $00, $00, //9x $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, //Ax 53, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, //Bx $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, //Cx $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, //Dx $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, //Ex $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00); //Fx begin result:=map[d]; end;
:dehors:
...
bonjour
même si j'arrive a décoder
je crois que sa me servirait a rien
mais je ne comprend pas pourquoi ils ont fait sa
mon laser chinois ne peux qu'interpréter leur langage
j'aurai voulu me servir autre logiciel pour élaborer
mes programmes
ma machine laser ma couter plus de 3000 euro et elle n'est
pas compatible iso comme gravograph
bon je crois qu'on peux mettre résolu
merci a tous