Salut,
Je ne connais pas Python donc incapable d'expliquer le pourquoi du comment de ce code.
Mais un fichier est toujours de toute manière stocké en binaire. L'hexadécimal c'est juste une représentation du binaire. Il n'y a pas besoin (en Java en tout cas) de convertir les octets qu'on lit du fichier en hexadécimal pour les stocker dans un tableau d'octets (byte[]). Un octet c'est un octet et sa représentation n'est pas pertinente lorsqu'on le transfert (d'un fichier à un tableau par exemple). Après si on veut afficher les octets lus (en console par exemple), c'est un autre problème : on peut utiliser une conversion via Integer.toHexString( ) par exemple, ou, de préférence un formatage, par System.out.printf("%02x", octet);, par exemple.
A la base, on lit les octets un à un (ou par paquets d'octets pour de meilleures performances) et on les stocke dans le tableau (qu'on va devoir agrandir au fur et à mesure). La classe ByteArrayOutputStream va permettre de gérer automatiquement cette écriture et agrandissement.
Par exemple :
1 2 3 4 5 6 7 8 9 10 11 12
| public static byte[] readAllBytes(String filepath) throws IOException {
try (ByteArrayOutputStream output = new ByteArrayOutputStream() ) {
try(InputStream input
= new BufferedInputStream(Files.newInputStream(Paths.get(filepath)))) {
byte[] buffer = new byte[16384];
for(int read = input.read(buffer); read>=0; read = input.read(buffer)) {
output.write(buffer,0,read);
}
}
return output.toByteArray();
}
} |
Cependant, le JDK fournit une méthode toute faite qui permet de lire directement un byte[] depuis un fichier :
byte[] array = Files.readAllBytes(Paths.get("example.bin")); // chemin à adapter
Bien sûr, l'usage de ce code est limité à un fichier dont le nombre d'octets est inférieur à la taille maximum d'un tableau et la mémoire disponible forcément.
La solution, si nécessaire, dépend de ce que tu cherches à faire au final, quel est le contenu du fichier, ce que tu veux en faire, etc. Charger un fichier complètement en mémoire n'est pas forcément la meilleure solution (on peut lire le fichier par exemple via un RandomAccessFile).
Partager