J'ai un fichier dans java je veux convertir pic.bmp em> vers un tableau de valeurs hexagonales afin que je puisse éditer et l'enregistrer comme modifié Version. P> Y a-t-il une classe Java pour faire cela? p> p>
4 Réponses :
Java possède une vaste lecture de la lecture / écriture d'images et d'édition d'images. Regardez les paquets javax.imageio code> (voici le Documentation ). Vous voudriez probablement créer un
bufferedimage code> à l'aide de
imageoIO code>, puis accédez aux données d'image de l'objet code> bufferedimage code> (il existe des méthodes pour cela). < P> Si vous souhaitez une réponse générique, pour tout type de données binaires (pas seulement des images), je suppose que vous devriez lire le contenu du fichier dans une matrice d'octet. Quelque chose comme ceci: p>
Je veux être capable de convertir en heex tout fichier s'il s'agit d'une image ou d'une archive d'exécutable ou d'une fermeture à glissière. Il n'y a donc pas de moyen général de lire le fichier en tant que binaire ou hexadécimal de modifier les valeurs et d'enregistrer en tant que nouveau fichier modifié?
in.Read (octets) est la manière la plus générale de le faire. Si vous souhaitez générer un numéro en hex, utilisez System.out.printf ("% x", octets [0]);
Si vous voulez tripoter les octets vous-même, obtenez un fichier filechannel à partir du fichierInputtream, puis allouez un bytebuffer, puis lisez tout le contenu. Bytebuffer a également des méthodes pour traiter des plus gros morceaux d'octets, dans les deux commandes d'octets différents. P>
Vous avez de la chance. Je devais faire cela il y a quelques mois. Voici une version hammée qui prend deux paramètres de la ligne de commande. Les deux paramètres de la ligne Comand sont des noms de fichiers ... Le premier est le fichier d'entrée et le second est le fichier de sortie. Le fichier d'entrée est lu en binaire et le fichier de sortie est écrit en tant que ASCII HEX. J'espère que vous pourrez simplement adapter cela à vos besoins.
import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; public class BinToHex { private final static String[] hexSymbols = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" }; public final static int BITS_PER_HEX_DIGIT = 4; public static String toHexFromByte(final byte b) { byte leftSymbol = (byte)((b >>> BITS_PER_HEX_DIGIT) & 0x0f); byte rightSymbol = (byte)(b & 0x0f); return (hexSymbols[leftSymbol] + hexSymbols[rightSymbol]); } public static String toHexFromBytes(final byte[] bytes) { if(bytes == null || bytes.length == 0) { return (""); } // there are 2 hex digits per byte StringBuilder hexBuffer = new StringBuilder(bytes.length * 2); // for each byte, convert it to hex and append it to the buffer for(int i = 0; i < bytes.length; i++) { hexBuffer.append(toHexFromByte(bytes[i])); } return (hexBuffer.toString()); } public static void main(final String[] args) throws IOException { try { FileInputStream fis = new FileInputStream(new File(args[0])); BufferedWriter fos = new BufferedWriter(new FileWriter(new File(args[1]))); byte[] bytes = new byte[800]; int value = 0; do { value = fis.read(bytes); fos.write(toHexFromBytes(bytes)); }while(value != -1); fos.flush(); fos.close(); } catch(Exception e) { e.printStackTrace(); } } }
Merci! C'est exactement ce dont j'avais besoin. Tu gères!
Si votre salaire dépend des lignes de code, vous pouvez écrire 256 si des déclarations :)
Vous pouvez utiliser string.format ("% x") code> au lieu de vos méthodes code> tohexfromebyte code>.
String.Format () ou Java's Printf est certainement plus joli code-sage, mais dans mon expérience, ils sont douloureusement lents par rapport à la manipulation d'octets et à une recherche de tableau directement. C'est la seule raison pour laquelle j'ai mis en œuvre ma propre méthode ToHexBromebyte.
@Brent: Je n'ai pas pensé à la performance, désolé pour le commentaire précédent.
Si vous vous souciez de la performance, je pense que vous devez modifier TOHEXFROMBYTE (byte b) pour ajouter au StringBuilder, plutôt que de renvoyer une nouvelle chaîne de 2 caractères.
@Pilgrim aucune inquiétude, c'était un point parfaitement raisonnable. Si la performance n'est pas une préoccupation majeure, votre chemin est certainement beaucoup plus facile à lire / à comprendre. @ykaganovich ouais, bon point. :-D Pour cette application particulière, la méthode TOHEXFROMBYTE (OTECHE) n'a probablement pas besoin d'être une fonction distincte car elle n'est jamais appelée à l'extérieur de TOHEXFROMBYTES.
Si vous tapez "Java Hexidecimal coding" dans une recherche Google, le premier résultat est http://commons.apache.org/codec/api-release/org/apache/commons/codec/binary/hex.html , ce que vous devriez devoir Utilisez pour répondre à la "Je veux convertir pic.bmp vers un tableau de valeurs hexagonales" une partie de votre question. P>
Je ne vois pas comment cela vous aide donc "pour que je puisse modifier et l'enregistrer comme une version modifiée" cependant. Vous devriez probablement utiliser un éditeur hexidécimal pour cela. par exemple. GHEX2 P>
Ne serait-il pas plus facile d'utiliser un outil tel que
hexdump code>,
heexedit code> ou simplement
:%! Xxd code> dans vim?