Bonjour à tous,
je cherche à importer des données hexa contenues dans un fichier texte (taille jusqu'à 50Mo). La longueur de chaque ligne est variable.
Par exemple:
Je souhaite obtenir un Cell contenant un array au format Int pour chaque ligne du fichier:166 30 A5 BB 72 00 5A CD A2 91 6C 57 28 06 8A 89 00 61 6A D0 00 00 4E 0B C2
458 30 A5 BB 73 00 5A CE CA 91 6E 58 38 00 56 8A 00 61 6A E0 00 00 4E 0C E4
778 30 A5 BB 74 00 5A D0 0A 91 2A 65 70 0D AD B1 2B 5F 88 15 FE 00 00 00 00 6A CC 61 7C 0D 60 8B 00 61 6A F0 00 00 4E 0E 1A
J'arrive à obtenir ça en faisant par exemple ceci:64 48 0 178 223 5 38 91 150 178 80 20 40 54 136 64 0 0 0 0 0 100 230 97 134 14 64 130 0 21 140 48 0 0 60 7 73
1624 48 0 178 224 0 0 2 27 146 3 24 48 88 191 64 0 131 0 21 140 64 0 0 60 9 183
4888 48 0 178 225 0 0 4 108 146 9 32 120 14 112 64 0 146 73 35 200 16 47 64 0 178 107 37 128 36 47 64 0 0 0 0 0 98 0 96 213 14 64 146 131 38 200 4 15 64 0 132 0 21 140 80 0 0 60 12 36
Cependant, strsplit et hex2dec sont très gourmandes en temps... donc pour des fichiers de 100000 lignes, c'est inconcevable...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 A=textscan(fileID,'%s','delimiter','\n'); fclose(fileID); A=A{1,1}; for i=1:size(A,1) A{i}=cellfun(@hex2dec,strsplit(A{i})); end
J'ai testé une autre méthode:
Celle-ci est suffisamment rapide mais j'ai un problème très bizarre sur certaines lignes (toujours les mêmes).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 max_num_col = 100; format = repmat('%2x',1,max_num_col); format=['%8f',format]; %% line=0; %Lecture de la première ligne du fichier tline = fgetl(fileID); %Tant qu'on est pas à la fin du fichier while ischar(tline) %Lecture de la ligne au format adéquat trame=sscanf(tline,format)'; end
Par exemple celle-ci:
Quand elle est décodée avec "sscanf", il y a un "zéro" qui se rajoute au niveau de ce qui est en rouge:18939 30 00 B2 FD 00 00 48 C3 77 10 15 8E 40 C0 00 3C 00 00 48 94 00 00 A0 29 02 20 61 2B 00 00 00 00 00 00 00 00 61 7C 0E 40 B2 30 02 78 54 7F 40 00 00 00 00 00 45 CB 00 00 0E 40 B3 3E 03 30 48 77 40 00 00 00 00 00 45 DC 61 72 0E 40 91 48 03 B8 0C A0 40 00 B2 72 05 E8 4D 8F 40 00 00 00 00 00 44 E7 61 7C 0E 40 A0 84 06 D0 4D 8E 00 00 00 00 00 00 24 E7 21 7C 0E 40 92 7D 06 78 10 D7 40 00 80 00 15 8E 10 00 00 3C 02 6E
CE QUI EST DANS tline:
18939 30 00 B2 FD 00 00 48 C3 77 10 15 8E 40 C0 00 3C 00 00 48 94 00 00 A0 29 02 20 61 2B 00 00 00 00 00 00 00 00 61 7C 0E 40 B2 30 02 78 54 7F 40 00 00 00 00 00 45 CB 00 00 0E 40 B3 3E 03 30 48 77 40 00 00 00 00 00 45 DC 61 72 0E 40 91 48 03 B8 0C A0 40 00 B2 72 05 E8 4D 8F 40 00 00 00 00 00 44 E7 61 7C 0E 40 A0 84 06 D0 4D 8E 00 00 00 00 00 00 24 E7 21 7C 0E 40 92 7D 06 78 10 D7 40 00 80 00 15 8E 10 00 00 3C 02 6ESi quelqu'un a une idée sur une autre méthode (voire plus rapide que la seconde...), merci d'avance!CE QUI EST DECODE PAR sscanf:
..... 97 124 14 0 64 .....
Et si quelqu'un comprend ce bug avec sscanf, je suis preneur aussi.
Merci d'avance!
Partager