OVH Cloud OVH Cloud

? "4E" ----> "N"

8 réponses
Avatar
Ericcson
Bonjour,

J'ai un fichier text qui contient : "4E"
c'est-à-dire les octets suivants : 34 45 0D 0A

J'ai utilisé read() de FileReader pour lire c1 = "34" puis c2 = "45"
puis j'ai fait calculer c = 4E en base 16, soit "N" en ASCII. Cela prend
quelques lignes de code.

Mais je voudrais une classe qui ait une méthode qui lise les deux octets et
à laquelle je puisse indiquer qu'il faut les lire comme étant la
représentation de la valeur hexadécimale de "N" sans avoir à faire effectuer
les calculs de déchiffrement.
Y-a-t-il une API de Java qui le fasse et quelle(s) méthode(s) employer ?

Ericcson

8 réponses

Avatar
Olivier Thomann
Le Fri, 13 Feb 2004 10:25:30 +0100, "Ericcson" a
Mais je voudrais une classe qui ait une méthode qui lise les deux octets et
à laquelle je puisse indiquer qu'il faut les lire comme étant la
représentation de la valeur hexadécimale de "N" sans avoir à faire effectuer
les calculs de déchiffrement.
Y-a-t-il une API de Java qui le fasse et quelle(s) méthode(s) employer ?
Je ne comprends pas. Voici un bout de code qui fait ce que tu veux et

qui utilise un FileReader.

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class TestReader {
public static void main(String[] args) {
try {
BufferedReader reader = new BufferedReader(new
FileReader("d:/temp/test.txt"));

int c;
while ((c = reader.read()) != -1) {
System.out.print((char) c);
}
System.out.println();
} catch (FileNotFoundException e) {
} catch (IOException e) {
}
}
}

Bien entendu il faut que tu corriges le chemin vers le fichier.

Dans la console, j'ai:
4E
--
Olivier

Avatar
Ericcson
"Olivier Thomann" a écrit dans le
message de news:

Dans la console, j'ai:
4E


Merci, Olivier, pour la réponse très détaillée, mais je ne veux pas "4E"
dans la console, mais "N", et cela sans que j'ai moi-même à lui dire ce
qu'il doit faire avec "3445" pour afficher "N".
Je cherche donc s'il existe une méthode d'API qui lise deux octets ("34"
puis "45") et m'affiche "N".

Ce qui m'a fait penser qu'une telle méthode pourrait exister ce sont les API
auxquelles on passe en paramètre ",16" et qui affiche des nombres en base
16, comme, par exemple :
System.out.println(Integer.parseInt("80",16));

ou bien qui affichent en héxadécimal, comme :
System.out.println(Integer.toHexString(i));

Ericcson

Avatar
Olivier Thomann
Le Sat, 14 Feb 2004 08:01:12 +0100, "Ericcson" a
Merci, Olivier, pour la réponse très détaillée, mais je ne veux pas "4E"
dans la console, mais "N", et cela sans que j'ai moi-même à lui dire ce
qu'il doit faire avec "3445" pour afficher "N".
Je cherche donc s'il existe une méthode d'API qui lise deux octets ("34"
puis "45") et m'affiche "N".
Ok, je comprends mieux le problème. Je vais regarder.

--
Olivier

Avatar
Olivier Thomann
Le Sat, 14 Feb 2004 08:01:12 +0100, "Ericcson" a
Merci, Olivier, pour la réponse très détaillée, mais je ne veux pas "4E"
dans la console, mais "N", et cela sans que j'ai moi-même à lui dire ce
qu'il doit faire avec "3445" pour afficher "N".
Je cherche donc s'il existe une méthode d'API qui lise deux octets ("34"
puis "45") et m'affiche "N".
Peut-être cherches-tu quelque chose comme ça:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class TestReader {
public static void main(String[] args) {
try {
final String fileName = "d:/temp/test.txt";

// creation du fichier
DataOutputStream outputStream = new
DataOutputStream(new BufferedOutputStream(new
FileOutputStream(fileName)));
outputStream.writeChar('N');
outputStream.flush();
outputStream.close();

// lecture du fichier
DataInputStream inputStream = new
DataInputStream(new BufferedInputStream(new
FileInputStream(fileName)));
try {
while (true) {

System.out.print(inputStream.readChar());
}
} catch (EOFException e1) {
System.out.println();
System.out.println("END");
}
inputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

Avatar
Ericcson
"Olivier Thomann" a écrit dans le
message de news:
Peut-être cherches-tu quelque chose comme ça:
....


OK, Olivier, ton programme marche très bien mais dans la question que je
pose test.txt ne doit pas contenir 004E mais 3445.

Ericcson

Avatar
Olivier Thomann
Le Sat, 14 Feb 2004 19:21:55 +0100, "Ericcson" a
OK, Olivier, ton programme marche très bien mais dans la question que je
pose test.txt ne doit pas contenir 004E mais 3445.
Dans ce cas tu n'as pas le choix de faire la conversion toi-même. Tu

veux lire un fichier texte et le décoder en tant que nombre
hexadécimal. Pas très consistant tout ça :-).
--
Olivier

Avatar
Ericcson
"Olivier Thomann" a écrit dans le
message de news:
Le Sat, 14 Feb 2004 19:21:55 +0100, "Ericcson" a
OK, Olivier, ton programme marche très bien mais dans la question que je
pose test.txt ne doit pas contenir 004E mais 3445.
Dans ce cas tu n'as pas le choix de faire la conversion toi-même. Tu

veux lire un fichier texte et le décoder en tant que nombre
hexadécimal. Pas très consistant tout ça :-).


Ok, Olivier.
La consistance vient de ceci :
1. "3445" , c'est "4E" et 0x4E c'est "N"
2.dans : System.out.println(Integer.parseInt("80",16));
"3830" est bien transformé en 128
Il n'est donc pas si inconsistant de s'interroger sur le point de savoir
s'il existe une méthode qui transforme "3445" en "N".

Quant au pourquoi vouloir le faire, je pourrais te dire que j'ai un fichier
crypté, que le décryptage ne donne pas directement "4E" mais "3445", qu'une
phase supplémentaire est donc nécessaire pour passer de "3445" à "4E", que
je n'ai attendu personne pour le faire, mais que j'étais curieux de savoir
si l'on pouvait faire plus rapide etc...etc... etc... mais à quoi bon car
c'est toujours plus beau lorsque c'est inutile.

Ericcson
Ericcson


Avatar
Ericcson
"Olivier Thomann" a écrit dans le
message de news:
Dans ce cas tu n'as pas le choix de faire la conversion toi-même.


Je pense avoir trouvé la solution :
le fichier text contient :
"4E4F50"
c'est-à -dire "NOP"
il est constitué de la succession suivante d'octets : 344534463530

en prenant les octets deux par deux :
s = str.substring(i, i+2)
puis en faisant :
c = Integer.parseInt(s,16)
et en affichant (char) c j'obtiens bien NOR.

Ericcson