Comme 0xFFD9 n'est pas nécessaire pour être présent dans l'image JPEG (comme marqueur EOF) et même s'il est présent, il peut donner un résultat incorrect en raison de la vignette incorporée en jpeg, donc j'ai besoin d'analyser JPEG pour extraire g zip). J'ai le code Java suivant basé sur l'hypothèse qu'un marqueur sera suivi par 2 longueur d'octets. Mais ce n'est pas le cas avec le segment SOS, c'est-à-dire le marqueur 0xFFDA. Comment puis-je détecter EOF en JPEG?Comment extraire des données ajoutées à la fin de l'image jpeg (détection de jpeg EOF).
public String getJPEGAppendedData(DataInputStream in) {
StringBuilder message = new StringBuilder();
try {
// reading first two bytes 0xFFD8
in.readFully(new byte[2]);
// 0xFFXX
byte twoBytes[] = new byte[2];
while (true) {
in.readFully(twoBytes);
if (twoBytes[0] == (byte) 0xFF) {
if (twoBytes[1] == (byte) 0xDD) {
// fixed 4 bytes payload
in.readFully(new byte[4]);
} else if (twoBytes[1] == (byte) 0xD9) {
// end of image reached
break;
} else if (twoBytes[1] >= (byte) 0xD0 && twoBytes[1] <= (byte) 0xD7) {
// no payload
} else {
// reading payload length form two bytes
short length = in.readShort();
System.out.println(length);
// skipping payload
for (int i = 1; i <= length - 2; i++) {
in.readByte();
}
}
} else {
break;
}
}
// reading appended data (byte by byte) if any
boolean moreData = true;
while (moreData) {
try {
byte b = in.readByte();
message.append(String.format("%02X", b));
} catch (Exception e) {
moreData = false;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return message.toString();
}
Non, je ne produis pas de message moi-même. Mon programme acceptera n'importe quelle image et extraira les données ajoutées le cas échéant (stéganographie). –