Newsgroup: it.comp.java
Titolo: Conversione byte -> stringa

Salve a tutti, una domanda semplice semplice:
Ho un array di byte che dovrei convertire in una stringa; mi serve una
conversione
1 byte -> 1 carattere.
Ho provato ad usare il costruttore String per fare la conversione, ma:
- Se non indico il formato di conversione da usare, usa l'unicode e la
stringa finale e' lunga esattamente il doppio dell'array
- Se come formato indico "UTF8", la stringa risultante e' vuota.
- Se come formato indico "UTF-8" viene generata un'eccezione:
java.io.UnsupportedEncodingException: UTF-8 [Could not load class:
sun.io.ByteToCharUTF-8]
Qualcuno puo' aiutarmi?

1 byte -> 1 carattere.
[CUT]
Sarebbe *utile* sapere cosa rappresentano i byte (cioč quale encoding č 
stato usato).
Es.
public class Drizzt {
    public static void main(String[] args) throws Exception {
        byte[] b = "Drizzt".getBytes("US-ASCII");
        for (int i = 0; i < b.length; i++) {
            System.out.println(b[i]);
        }
        System.out.println(new String(b, "US-ASCII"));
    }
}
HTH
-- 
Ciao
	Fabrizio C.


Arghhh...I byte sono byte!! ^___^

 Arghhh...I byte sono byte!! ^___^
Si: i byte sono byte...
... il problema, mio caro, e' che i char non sono byte! Eh Eh !!!
Quindi devi specificare con quale encoding sono stati codificati quei bytes!
- Dario


Si, ok, allora non ci siamo capiti. Sono byte! Puri e semplici byte, non
codificati :-)
Mi serve di buttarli in una stringa per vari motivi, ma non per trasformarli
in un testo leggibile.


Se vuou usarli come byte lasciali nel vettore di byte.
Se li butti in una stringa vuol dire che e' testo.
I bytes in java sono interi compresi tra -128 e +127.
I char (gli elementi di una stringa) sono interi compresi tra 0 e 65535.
Ad esempio il vettore di 3 bytes: -27, -82, -99
convertito in stringa
  con US-ASCII   da' stringa di 3 chars con valori 65533, 65533, 65533.
  con ISO-8859-1 da' stringa di 3 chars con valori 229, 164, 167.
  con UTF-8      da' stringa di 1 char  con valore 22823.
  con UTF-16     da' stringa di 2 chars con valori 58788, 65533.
Ad esempio il vettore di 3 bytes: 65, 66, 67
convertito in stringa
  con US-ASCII   da' stringa di 3 chars con valori 65, 66, 67.
  con ISO-8859-1 da' stringa di 3 chars con valori 65, 66, 67.
  con UTF-8      da' stringa di 3 chars con valore 65, 66, 67.
  con UTF-16     da' stringa di 2 chars con valori 16706, 65533.
E' chiaro che bisogna quindi specificare con quale char-set
(US-ASCII o ISO-8859-1 o UTF-8 o UTF-16 o qualche altro...)
si vuole far la conversione?
A seconda del charset specificato cambia la conversione,
che puo' dare stringhe + o - lunghe del vettore originario
e con valori molto differenti fra di loro?
E' chiaro?
Ma, se come dici tu, il vettore di bytes non contiene testo,
allora non vale la pena convertirlo in stringa!
Ok?
- Dario

 Ok?
Ok. Ridatemi il C ^__^
Facciamo cosi': ti spiego il problema dall'inizio alla fine e vediamo se
riesci a tirarmene fuori, ok? ;-)
(finora mi ero tenuto sul generico, visto che e' piu' un problema M$ Java
che non semplicemente Java)
Un po' per allenamento, un po' per sfida, un po' per vari motivi avevo
scritto un piccolo tool che comprendeva, tra l'altro, una pagina ASP. Questa
pagina ASP elabora tutta una serie di cose, genera una bella sequenza di
byte e la stampa a video con il Response.Write dopo aver impostato
Response.ContentType="multipart/mixed".
Il tutto funziona egregiamente; unico neo, voglio riditribuire il tool e
onestamente l'idea di distribuirne anche il sorgente (l'ASP) non mi eccita
piu' di tanto.
Soluzione: creare un oggetto COM in Java e fare tutto il lavoro da li'.
L'unico ASP diventa quello che crea l'oggetto...
Il problema di questa soluzione e' che non mi piace l'idea di dover
dipendere eccessivamente da pacchetti classi particolari. Siccome il mio
target e' IIS 5.0 o superiore, ho deciso di usare i pacchetti Java che
vengono installati automaticamente da IIS. Quindi per accedere a Response e
Request li passo come argomento all'oggetto COM.
(fin qui, per spiegare le decisioni su come sono arrivato a questo punto)
Ora: l'oggetto COM alla fine ha generato un'array di byte. Quest'array e'
lungo x byte, di cui solo una parte sono dati utili. Adesso devo buttare i
byte in questione sulla pagina HTML, e qui mi sono bloccato.
Response.Write prende un Variant che contiene una stringa.
Response.BinaryWrite prende un Variant che contiene un'array di Byte.
Il Variant che contiene una stringa riesco a generarlo tranquillamente.
Problema, l'encoding mi fa' saltare il tutto. Ed a quanto pare, non e'
risolvibile.
Invece, un Variant che contiene un'array di byte non riesco assolutamente a
crearlo.
E l'msdn chiaramente si guarda bene dal fornire qualsiasi aiuto utile...
(l'help sul Java sembra una presa per i fondelli...)
E' piu' chiaro il problema, ora? :-)