Non.
Tu fais un <BR/> à chaque caractère et le point dans l'expression suivante indique une concaténation. $res2 .= dechex(ord($str2[$i]));
Il faut que tu mettes $res2 = dechex(ord($str2[$i])); sans le .
Version imprimable
Non.
Tu fais un <BR/> à chaque caractère et le point dans l'expression suivante indique une concaténation. $res2 .= dechex(ord($str2[$i]));
Il faut que tu mettes $res2 = dechex(ord($str2[$i])); sans le .
Merci badaze mais j'avais déjà essaye vendredi sans la concatenation.
Le probleme est que l'affichage ne correspond pas alors à deux octets
Résultat à l'affichageCode:
1
2
3
4
5 for ($i=0;$i<strlen($str2);$i++) { $res2 = dechex(ord($str2[$i])); echo $res2.'<BR />'; }
Pièce jointe 243970
je m'en vais essayer ton fichier avec tes exemples
C'est que tu es dans le cas d'un octet dont la valeur est inférieure à 10.
Soit tu regardes le fonctionnement de la fonction printf soit tu ajoutes un 0 devant et avant d'afficher le résultat si la valeur est < 10.
Je pense que je dois mal m'exprimer quand je parle d'octets .....
Si tu regardes le derniere affichage que j'ai ( post precedent)
et ceci que j'aimerais recuperer
DC 00
04 01
2C 01
5E 01
90 01
F4 01
58 02
BC 02
52 03
E8 03
B0 04
DC 05
6C 07
60 09
54 0B
48 0D
04 10
EC 13
00 19
A4 1F
tu comprends qu'il manque en fait la deuxieme ligne du premier affichage. En gros
dans mon affichage precedent
DC
0
correspondent à la première ligne de ce que je veux avoir soit DC 00
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 <?php $string = file_get_contents('SSDTSetup.exe'); $nombre_caractères = 60; $octets = '3DB197A43A0A7550A883DD052112F1'; $pattern = '~([0-9A-F]{2})~'; preg_match_all($pattern,$octets,$resultat); $recherche = ""; foreach($resultat[0] as $value) { $recherche .= chr(hexdec($value)); } $position = strpos($string,$recherche); if ($position !== false) { $pos2 = $position+strlen($recherche); $str2 = substr($string,$pos2,$nombre_caractères); $res2 = ""; $sdl = 0; for ($i=0;$i<strlen($str2);$i++) { $res2 = strtoupper(dechex(ord($str2[$i]))); $octet = strlen($res2) == 1 ? '0'.$res2 : $res2; print $octet." "; $sdl++; if ($sdl == 2) { $sdl = 0; print "<br/>"; } } print "Position DEC $pos2 "; print "Position HEX ".strtoupper(dechex($pos2));; print "<br/>Caractères suivants HEX => $res2 "; } else { print "Pas trouvé"; }
c'est tout à fait ça !! Merci
dans la doc technique, il est à juste titre precisé qu'il faut prefere file_get_contents comme tu le fais pour pouvoir lire un fichier distant plutot que d'utiliser fopen.
Par contre, il nous montre comment remettre le pointeur en haut du fichier ( fonction rewind) ce qui est utile si on souhaite effectuer une autre recherche.
puis -je partir sur la base de
Code:
1
2
3
4
5
6
7 if ( TRUE === rewind ($string)){ echo ' remise à zero du pointeur'; }
Ce n'est pas la peine (et en plus ça ne sert à rien).
Le "texte" du fichier est dans la variable $string. La variable est un tableau d'octets et la recherche se fait sur ce tableau d'octets non sur le fichier en lui même.
je reprends mon projet après une longue très longue absence.
Je suis en train de m'orienter coté objet en utilisant la methode magique _tostring.
Or quand j'utilise celle-ci j'ai un probleme d'affichage et quand je reste en procedural tout s'affiche correctement.
ex :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123 private function GetLegendTps($string){ $this->sEcho.= 'Legende Tps : <BR />'; $this->sEcho.= 'Chaine hexadecimal recherchee : 11 70 17 28 23 sur 20 octets <BR />'; $iNbreValeurHexaALire = 40; $hSearch = '1170172823'; // Chaine hexa correspondant ÃÂ* la legende Tps $pattern = '~([0-9A-F]{2})~'; preg_match_all($pattern,$hSearch,$resultat); $recherche =''; foreach($resultat[0] as $value) { $recherche .= chr(hexdec($value)); } // $position correspond ÃÂ* la premiere occurence $position = strpos($string,$recherche); if ($position !== false) { // calcul de la position de la premiere valeur hexadecima; situé après la chaine hexa qui correspond ÃÂ* la legende tps // Cette chaine hexa est 1170172823, la longeur de cette chaine hexa ajouté ÃÂ* la position de cette occurence nous donne le point de depart. $pos2 = $position+strlen($recherche); // Calcul de la l'adresse hexadecimal correspondant ÃÂ* la premiere valeur $this->sEcho.= 'Adresse Hexadecimal : 0x'.dechex($pos2).'<BR/>'; //je transforme la valeur decimal en hexadecimal qui correspond ÃÂ* l'adresse hexadecimal dans le fichier binaire // calcul de la valeur de l'adresse hexadecimal du dernier octet $ahPositionFinale = $pos2+$iNbreValeurHexaALire-1; $this->sEcho.= 'Fin adresse Hexadecimal : 0x'.dechex($ahPositionFinale).'<BR />'; //$this->sEcho.= 'Valeur HEX=>'.dechex(ord($string[$pos2])).'<BR />'; //$this->sEcho.= 'Valeur DEC=> '.ord($string[$pos2]).'<BR />'; //$str2 correspond au segment de chaine defini par la position pos2 et de taille iNbreValeurHexaALire $str2 = substr($string,$pos2,$iNbreValeurHexaALire); $this->sEcho.= 'La taille de la chaine Ã*Â* lire est de '.strlen ($str2).'<BR />'; //debug $this->sEcho.= "$str2"; $aMaChaineEnTableau = str_split($str2,2); foreach ($aMaChaineEnTableau as $value) { $this->sEcho.= $value.'<BR />'; } // creation du tableau aArayChunk en recuperant les elements par deux issus du tableau aMaChaineEnTableau $aArrayChunk = array_chunk($aMaChaineEnTableau,2, FALSE); $b = array_map(function($v) { return implode('', array_reverse($v)); }, array_chunk($aMaChaineEnTableau, 2)); $this->sEcho.='Etape transtypage - Le tableau correspondant Ã* la legende tps compte '.count($b).' valeurs.<BR />'; foreach ($b as $value) { // test $this->sEcho.=' => '.$this->AffichageChiffreHexDec(hexdec($value)).'° <BR />'; echo $value; if ($this->TestLegendeTpsValide(hexdec($value))===TRUE){ $this->sEcho.= $value.'=> '.$this->AffichageChiffreHexDec(hexdec($value)).'° <BR />'; } } /* fin du V2*/ } } private function AffichageChiffreHexDec($iFloat){ $j = strlen($iFloat); for($i = 0 ; $i < $j ; $i++){ $aTabchaine[] = substr($iFloat,$i,1); } if ( $j=='3'){ $iNbreFormatee=$aTabchaine[0].','.$aTabchaine[1]; return $iNbreFormatee; }elseif ($j=='4'){ $iNbreFormatee=$aTabchaine[0].$aTabchaine[1].','.$aTabchaine[2].$aTabchaine[3]; return $iNbreFormatee; } } private function TestLegendeTpsValide($iValue){ if( 100<$iValue AND $iValue<8500){ return TRUE; } return FALSE; }
j'obtiens
Legende tps:
Chaine hexadecimal recherchee : 11 70 17 28 23 sur 20 octets
Adresse Hexadecimal : 0x49a1c
Fin adresse Hexadecimal : 0x49a43
La taille de la chaine à lire est de 40
�,^��X�R���l` TH ���
,
^
�
�
X
�
R
�
�
�
l
`
T
H
�
�