Forum Clubic

[Java] Ajout d'un byte dans un fichier - Mauvaise valeur hexa de l'ajout

Bonjour,

je dev actuellement une appli qui doit générer un fichier dont le premier caractère de chaque ligne doit être le caractère dont la valeur est 157. Je l’ajoute ainsi :

	tamponEcriture.write(157); //ici, on ajoute le premier caractere
  	
tamponEcriture.write(messageParse);

Seulement, quand j’ouvre le fichier généré en hexa, à la place de 9D (157), j’ai 3F (ce qui correspond au caractère ASCII “?”).

Intrigué, j’ai décidé de créer dans mon application un byte de valeur 157. Et qu’est ce que je vois en debuggant… qu’il prend pour valeur -99.

Je suppose que c’est une histoire de codage bizarre du byte, mais je n’ai pas trouvé des masses d’explications.

Merci d’avance pour votre aide.

Bonjour,
Il faudrait nous dire le type de ta variable tamponEcriture, et quel “Stream” tu utilise pour écrire dans le fichier.
Parce que si tu veut être sur d’écrire les bytes que tu donne, il faut écrire le fichier en binaire, sinon Java encode les String pour les écrire en utf-8 (ou avec un autre charset par défaut), et si le code hexa n’est pas prévu dans le charset, il est transformé.

Il faut donc passer par des flux binaires, encoder tes String à l’aide d’un Charset pour les envoyer dans ton fichier (à l’aide de String.toBytes(charset) ), et envoyer les bytes 9D directement non encodés.

quand à ton byte 9D qui vaut -99, c’est normal, il est signé, et 157 serait la valeur qu’il prendrait s’il était non-signé
cf la doc, un Byte qui wrappe un byte prend une valeur de -127 à +128
http://java.sun.com/j2se/1.4.2/docs/api/index.html
:slight_smile:

Bon, d’accord, poster du code trop incomplet, c 'est mal ^^

  FileWriter fluxEcritureFichier = new FileWriter(fileName, true);
  
  BufferedWriter tamponEcriture = new BufferedWriter(fluxEcritureFichier);
    
  Iterator iterateurListeMessages = listeMessagesAEnvoyer.iterator();
  
  
  
  
  while(iterateurListeMessages.hasNext())
  {
  	String messageParse=(String)iterateurListeMessages.next();
  	
  	
  	//byte b = (byte)(0x9d);
  	
  	//byte b = Byte.parseByte("9D",16);
      
  	tamponEcriture.write(157); //ici, on ajoute le premier caractere, 9D en hexa
  	
  	tamponEcriture.write(messageParse);
      
  	tamponEcriture.newLine();
  	
  }
  
  tamponEcriture.close();
  
  fluxEcritureFichier.close();

en revanche, je ne vois pas pourquoi tu dis qu’il faut que j’encode mes strings avec un charset? ca n’est pas une string que j’essaie d’ajouter, mais un byte, non? (edit , je crois que j’ai compris le fait de le forcer à balancer du binaire, vais essayer ça)

Et heu, le fait qu’il soit signé, c’est gênant ^^ pas moyen de lui faire écrire directement le byte 9D dans le fichier?

Nan c’est bon :super: j’avais compris quand même,
bon là, les “Writer” sont des flux de type caractère comme je pensais, il faut passer à un flux binaire donc un Stream
déclare fluxEcritureFichier comme un FileOutputStream,
http://java.sun.com/j2se/1.4.2/docs/api/index.html
tamponEcriture comme un BufferedOutpuStream
tu fait directement un


tamponEcriture.write(0x9d)
byte[] buffer = messageParse.getBytes("UTF-8");
tamponEcriture.write(buffer,0,buffer.length);
// il faudrait chercher les propriétés systèmes pour trouver le retour chariot windows ou UNIX
// CR
tamponEcriture.write(0x0D)
// LF
tamponEcriture.write(0x0A)

voir les encodings
http://java.sun.com/j2se/1.4.2/docs/api/index.html

Edit: je répond à ton edit :wink:

  • c’est pas grave s’il est signé, ça écrira bien 0D dans le fichier.
  • comme tu peux le voir c’est pour messageParse que ta as besoin du charset “UTF-8”, car les String Java sont stockées en mémoire en unicode 16 et il faut les convertir pour ne garder qu’un octet par caractère, de toute façon, tu est obligé de passer par une méthode getBytes() qui appelle pour toi le Charset.

:slight_smile:

ca marche bien, merci pour l’aide et les éclaircissements.

ok, je t’en prie :super: