Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Con velocità teoriche fino a 11 Gbps, gestione tramite app intelligente e protezione avanzata dei dispositivi, Roamii BE Pro porta il Wi‑Fi 7 tri‑band nelle abitazioni più esigenti. Un sistema Wi-Fi Mesh proposto da MSI allo scopo di garantire agli utenti una rete fluida e continua capace di sostenere streaming 8K, gaming competitivo e le applicazioni moderne più esigenti in termini di banda
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Mate X7 rinnova la sfida nel segmento dei pieghevoli premium puntando su un design ancora più sottile e resistente, unito al ritorno dei processori proprietari della serie Kirin. L'assenza dei servizi Google e del 5G pesa ancora sull'esperienza utente, ma il comparto fotografico e la qualità costruttiva cercano di compensare queste mancanze strutturali con soluzioni ingegneristiche di altissimo livello
Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 05-12-2007, 19:24   #1
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
[JAVA] problemino con ByteArrayOutputStream

Salve, devo inviare su un socket una Stringa convertita in array di byte. Per convertire la stringa uso

Codice:
byte[] buffer = "pippoplutopaperinopaperogaeziopaperone".getBytes();
dopodichè devo inviare questo buffer su un OutputStream di un socket. Non lo devo inviare tutto subito, ma 10 byte la volta. Mi hanno consigliato di usare ByteArrayOutputStream ma non ho capito come... mi date una mano?
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2007, 20:33   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da redcloud Guarda i messaggi
Codice:
byte[] buffer = "pippoplutopaperinopaperogaeziopaperone".getBytes();
Sì, tecnicamente corretto. Però vorrei precisare una cosa. Quando si parla di conversione da String a sequenza di byte (o viceversa) è necessario tenere sempre in considerazione il "charset" usato per codificare la sequenza di byte.

Ora ... getBytes() fornisce una sequenza di byte codificata secondo il charset di "default" della piattaforma (quale sia, dipende....). Visto che devi inviare la sequenza su socket, immagino ad un altro host, c'è da prestare attenzione ad una cosa: chi riceve la sequenza sa esattamente quale charset è stato usato per la codifica??

Quote:
Originariamente inviato da redcloud Guarda i messaggi
dopodichè devo inviare questo buffer su un OutputStream di un socket. Non lo devo inviare tutto subito, ma 10 byte la volta. Mi hanno consigliato di usare ByteArrayOutputStream ma non ho capito come... mi date una mano?
No, semmai è proprio la classe diametralmente opposta, cioè ByteArrayInputStream. Un ByteArrayInputStream lo si costruisce passando un array di byte e poi tramite i metodi read() si può leggere un tot di byte per volta (nel tuo caso, come hai detto, 10), che poi scriverai sul socket.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2007, 20:42   #3
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
Quote:
Originariamente inviato da andbin Guarda i messaggi
Sì, tecnicamente corretto. Però vorrei precisare una cosa. Quando si parla di conversione da String a sequenza di byte (o viceversa) è necessario tenere sempre in considerazione il "charset" usato per codificare la sequenza di byte.

Ora ... getBytes() fornisce una sequenza di byte codificata secondo il charset di "default" della piattaforma (quale sia, dipende....). Visto che devi inviare la sequenza su socket, immagino ad un altro host, c'è da prestare attenzione ad una cosa: chi riceve la sequenza sa esattamente quale charset è stato usato per la codifica??
Si ho tralasciato il discorso del charset perchè chi riceverà saprà come interpretare i byte.

Quote:
Originariamente inviato da andbin Guarda i messaggi
No, semmai è proprio la classe diametralmente opposta, cioè ByteArrayInputStream. Un ByteArrayInputStream lo si costruisce passando un array di byte e poi tramite i metodi read() si può leggere un tot di byte per volta (nel tuo caso, come hai detto, 10), che poi scriverai sul socket.
Ah e come li scrivo sul socket? Mi fai un esempio spiccio? Ti ringrazio molto.
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2007, 20:51   #4
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da redcloud Guarda i messaggi
Ah e come li scrivo sul socket? Mi fai un esempio spiccio? Ti ringrazio molto.
Semplificando e ignorando, per brevità, eccezioni ecc....:

Codice:
ByteArrayInputStream bais = new ByteArrayInputStream (arrBytes);
byte[] buf = new byte[10];
int len;

while ((len = bais.read (buf)) > 0)
    os.write (buf, 0, len);
Per 'os' intendo in generale un OutputStream associato al socket ... poi non so esattamente cosa userai.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2007, 21:18   #5
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
Quote:
Originariamente inviato da andbin Guarda i messaggi
Semplificando e ignorando, per brevità, eccezioni ecc....:

Codice:
ByteArrayInputStream bais = new ByteArrayInputStream (arrBytes);
byte[] buf = new byte[10];
int len;

while ((len = bais.read (buf)) > 0)
    os.write (buf, 0, len);
Per 'os' intendo in generale un OutputStream associato al socket ... poi non so esattamente cosa userai.
arrBytes è il byte[] che mi da getBytes()?

Quindi in pratica sto cavolo di bytearray è come se fosse un array con iteratore annesso: una figata! Ma esiste anche per altri tipi diversi da byte, chessò, StringArray, IntegerArray, o non ha senso?

Quindi fin quando read riesce a riempire il buf, len sarà sempre uguale alla lunghezza di buf (cioè 10)?

Grazie parecchio!
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2007, 21:19   #6
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
Un'altra cosa. Se lo stream collegato al socket è di tipo DataOutputStream va bene lo stesso?
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2007, 21:27   #7
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da redcloud Guarda i messaggi
arrBytes è il byte[] che mi da getBytes()?
Esatto.

Quote:
Originariamente inviato da redcloud Guarda i messaggi
Quindi in pratica sto cavolo di bytearray è come se fosse un array con iteratore annesso: una figata! Ma esiste anche per altri tipi diversi da byte, chessò, StringArray, IntegerArray, o non ha senso?
Ci sono CharArrayReader/CharArrayWriter che fanno una cosa concettualmente uguale.
Nel package java.nio ci sono classi per gestire dei Buffer più particolari (e differenti dagli stream), che si usano tipicamente con i "channel".

Quote:
Originariamente inviato da redcloud Guarda i messaggi
Quindi fin quando read riesce a riempire il buf, len sarà sempre uguale alla lunghezza di buf (cioè 10)?
Salvo l'ultimo blocco che potrebbe essere < 10. Quando non ci sono più byte, la read() ritorna -1, quindi il ciclo termina, per come ho posto la condizione.

Quote:
Originariamente inviato da redcloud Guarda i messaggi
Grazie parecchio!
Please.

Quote:
Originariamente inviato da redcloud Guarda i messaggi
Un'altra cosa. Se lo stream collegato al socket è di tipo DataOutputStream va bene lo stesso?
Si va benissimo perché è-un OutputStream. Io infatti non potevo sapere se usavi un DataOutputStream o un ObjectOutputStream!
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2007, 21:55   #8
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
Quote:
Originariamente inviato da andbin Guarda i messaggi
Si va benissimo perché è-un OutputStream. Io infatti non potevo sapere se usavi un DataOutputStream o un ObjectOutputStream!
Grazie. I casini me li ha creati un po' l'ereditarietà tra ArrayByteOutputStream, DataOutputStream e OutputStream. I primi infatti estendono OutputStream ma sono proprio due cose diverse tra loro e non riuscivo a capire come poter trasformare un ArrayByteOutputStream in uno stream direttamente collegabile a uno stream preso da socket. In questi casi come si fa? Si deve solo leggere attentamente la documentazione?
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2007, 22:06   #9
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da redcloud Guarda i messaggi
Grazie. I casini me li ha creati un po' l'ereditarietà tra ArrayByteOutputStream, DataOutputStream e OutputStream. I primi infatti estendono OutputStream ma sono proprio due cose diverse tra loro e non riuscivo a capire come poter trasformare un ArrayByteOutputStream in uno stream direttamente collegabile a uno stream preso da socket. In questi casi come si fa? Si deve solo leggere attentamente la documentazione?
Le varie classi che hai detto sono semplicemente a livelli di "astrazione" differenti. OutputStream è una classe astratta ed è la "base" di tutte le altre. DataOutputStream/ObjectOutputStream se vai a vedere nella documentazione, possono essere create passando appunto un OutputStream (che in genere è di livello più "basso" come un FileOutputStream o quello di un socket).

Ma nel tuo caso non serviva certo ArrayByteOutputStream, perché non devi creare l'array ma, avendolo già, leggerlo a pezzetti. Tra l'altro, volendo essere pignoli, si potrebbe fare anche senza usare ByteArrayInputStream. Avendo l'array di byte, ti bastava scrivere i blocchi di 10 byte ragionando sugli offset: da offset 0 len 10, da offset 10 len 10, ecc....
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2007, 22:12   #10
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
Quote:
Originariamente inviato da andbin Guarda i messaggi
Ma nel tuo caso non serviva certo ArrayByteOutputStream, perché non devi creare l'array ma, avendolo già, leggerlo a pezzetti. Tra l'altro, volendo essere pignoli, si potrebbe fare anche senza usare ByteArrayInputStream. Avendo l'array di byte, ti bastava scrivere i blocchi di 10 byte ragionando sugli offset: da offset 0 len 10, da offset 10 len 10, ecc....
Lo so, era proprio per evitare il lavoraccio che forse mi hanno consigliato di usare quella classe, visto che è lei che si occupa di leggere tot byte volta per volta senza preoccuparsi degli offset, visto che anche tu in 2 righe hai risolto il problema...

Grazie.
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2007, 22:23   #11
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da redcloud Guarda i messaggi
visto che anche tu in 2 righe hai risolto il problema...
Sì, in effetti con ByteArrayInputStream la soluzione è lineare e "pulita", anche se c'è chiaramente un leggero overhead (la creazione del ByteArrayInputStream, la creazione del buf, la lettura con copia nel buf).

Volendolo fare senza ByteArrayInputStream comunque non è proprio un lavoraccio:
Codice:
byte[] dati = ......
int off = 0;
int len = 10;

while (off < dati.length)
{
    len = Math.min (dati.length - off, len);
    os.write (dati, off, len);
    off += len;
}
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 06-12-2007, 17:05   #12
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
Scusami, una cosa ancora...

mi capita che l'ultimo ciclo di lettura legga meno caratteri della dimensione del buffer e quindi ottengo un buffer con dati sporchi nella parte finale. Come posso ottenere l'ultimo buffer di dimensione effettiva dei byte rimanenti? (scusa l'ingarbugliamento)
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 06-12-2007, 17:56   #13
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da redcloud Guarda i messaggi
mi capita che l'ultimo ciclo di lettura legga meno caratteri della dimensione del buffer e quindi ottengo un buffer con dati sporchi nella parte finale. Come posso ottenere l'ultimo buffer di dimensione effettiva dei byte rimanenti? (scusa l'ingarbugliamento)
Stai usando la soluzione con ByteArrayInputStream?? L'esempio di codice che ho postato all'inizio mi sembra(va) chiaro: quando leggo con la read(), devo tenere in considerazione il suo valore di ritorno (il numero di byte letti) perché lo devo usare nella write. Se l'ultimo blocco è lungo 6 e non 10, entrerò ancora nel ciclo (essendo > 0) e la write la farò di 6 byte.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 06-12-2007, 19:56   #14
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
Hai ragione, sbagliavo io a usare l'offset. Grazie!

Ho un altro quesito da porti:

Codice:
InputStream in = socket.getInputStream();

while(in.read() >= 0)
    System.out.println("DENTRO");

System.out.println("FUORI");
Perchè una volta inviati tutti i dati sul socket, FUORI non viene mai stampato? La read mi sembra di aver capito che è bloccante ma quando ritorna -1? Io scrivo sul socket semplicemente un byte[]...
redcloud è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo M...
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
Exynos 2700, Samsung già lavora a...
Microsoft rilascia Windows 11 26H1: cosa...
Apple vola in Cina: il merito è d...
WhatsApp Web sta per colmare la sua pi&u...
Spotify chiude un trimestre da record: i...
Samsung potrebbe riproporre smartphone c...
AirPods Pro 3 a 219€, AirTag da 4 pezzi ...
Sconto di 300€ su un MacBook Air e un Pr...
La Cina lancia un servizio simile a Dire...
SpaceX: Elon Musk torna a parlare dei pr...
G.Skill risarcisce 2,4 milioni di dollar...
Test degli annunci su ChatGPT avviati: '...
TSMC approva investimenti record da quas...
L'IA agentica arriva anche sullo storage...
Euro digitale, il Parlamento UE cambia r...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 09:09.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v