Visualizzazione dei risultati da 1 a 7 su 7

Discussione: String e byte

  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    31

    String e byte

    Ciao ragazzi,
    mi ritrovo in una situazione schematizzabile in questi termini: dato un vettore di byte inizializzato mediante l'assegnazione di una sequenza di interi, devo passare a una string e ritornare ai coefficienti del vettore di byte iniziale.

    Io avevo pensato di risolvere la questione così:

    byte b[] = { -38, -127, -53, -52, 87, 40, -50, -44, -53, 87, -56, -52, 63, 81, 0, -56, 76, -84, 2, 0, 43, -120, 5, -5 };
    String s = new String(b);

    byte b2[] = s.getBytes();

    for(int i=0; i<b2.length; i++)
    System.out.println((int)(b2[i]));

    Ero sicuro che sarei riuscito a riottenere gli stessi coefficienti di prima, invece non è così!! In particolare riesco sempre a riottenere tutti i coefficienti tranne il -127 che diventa sempre 63 (nota: anche il 63 mi viene recuperato come 63).

    Avete in mente altre altre soluzioni?
    Un grazie anticipato!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: String e byte

    Originariamente inviato da supern3t
    Ero sicuro che sarei riuscito a riottenere gli stessi coefficienti di prima, invece non è così!! In particolare riesco sempre a riottenere tutti i coefficienti tranne il -127 che diventa sempre 63 (nota: anche il 63 mi viene recuperato come 63).
    Certo, perché come mi è già capitato di spiegare altre volte, quando si tratta di fare conversioni tra byte[] e String c'è sempre da tenere in considerazione il charset.

    Il costruttore e il metodo getBytes() che hai usato usano il charset di "default" della piattaforma. Se usi Windows, come il sottoscritto, il charset è tipicamente windows-1252. Puoi scoprirlo facendo:

    System.out.println (Charset.defaultCharset());

    Ora ... -127 in hex è 0x81 (129 in decimale senza segno). Se vai a vedere il set di caratteri windows-1252 su Wikipedia:
    http://en.wikipedia.org/wiki/Windows-1252

    vedrai che il carattere con codice 0x81 non è codificato, non esiste in questo charset.

    Il decoder di Java lo sa, e in questo caso mette nella stringa il carattere '?'. Sai quale è il codice del carattere '?'?? Proprio 63.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    31
    ottima spiegazione..
    ..ma in che modo potrei aggirare il problema? Ovviamente a me non interessa usare un determinato charset piuttosto che un altro, a me basta riuscire a tornare ai coefficienti del vettore di byte di partenza!

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    31
    in base alla tua spiegazione, ho trovato il charset ISO-8859-1 che sembra avere tutti i simboli definiti e perciò sembra andare!! thanks!

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da supern3t
    in base alla tua spiegazione, ho trovato il charset ISO-8859-1
    Appunto, stavo quasi per postare per suggerirtelo ma vedo che lo hai già trovato. Non avendo "buchi" va bene per quello che vuoi fare.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    31
    approfitto della tua gentilezza per un'ultima richiesta: non c'è una istruzione che mi permette di fare in modo che il mio programma utilizzi sempre un determinato charset per rappresentare le stringhe senza doverlo di volta in volta specificare?

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da supern3t
    non c'è una istruzione che mi permette di fare in modo che il mio programma utilizzi sempre un determinato charset per rappresentare le stringhe senza doverlo di volta in volta specificare?
    Le stringhe sono sempre rappresentate in UTF-16, essendo i char a 16 bit. Il problema dei charset è appunto solo quando c'è una conversione da/a byte[].

    Che io sappia, il charset di "default" lo puoi cambiare solo avviando la applicazione specificando il parametro per impostare la property "file.encoding":

    java -Dfile.encoding=ISO-8859-1 TuaClasse

    Impostare questa property da programma tramite System.setProperty() cambia solo il suo valore, ma non ha effetto sul charset di default.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.