View Full Version : [JAVA]: problemi lettura dati binari
mercury841
30-12-2008, 08:40
Ciao a tutti, vi spiego qual'è il mio problema.
Devo leggere dei dati binari provenienti da un terminale e salvarli su un file binario.
Il problema è che quando apro il file mi trovo alcuni dati errati, per esempio:
questo è il file di uscita:
1E 20 20 07 30 38 31 32 32 33
questo è il file corretto che dovrei ottenere:
1E 00 00 07 30 38 31 32 32 33
Il metodo che fa questa operazione è fatto in questo modo:
byte[] buff = new byte[1024];
int ret_read = 0;
try {
InputStream inputStream = telnetClient.getInputStream();
FileOutputStream file = new FileOutputStream("file.dat");;
ret_read = inputStream.read(buff);
while (ret_read >= 0){
file.write(buff, 0, ret_read);
ret_read = inputStream.read(buff);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Secondo voi come posso risolvere?
ciao e grazie per l'aiuto che saprete darmi.
Anch'io ho avuto un tuo stesso problema, ma non sono riuscito a risolvere, ed ho dovuto cambiare linguaggio di programmazione per ovviare
stdecden
30-12-2008, 12:15
Puó darsi che per qualche ragione i 0x00 vengono trasformati in spazi del codice ASCII (0x20)
mercury841
30-12-2008, 13:03
Puó darsi che per qualche ragione i 0x00 vengono trasformati in spazi del codice ASCII (0x20)
si è proprio questo, come potrei risolvere?
posso evitare che i byte vengano trasformati in codice ASCII ?
mercury841
31-12-2008, 07:35
nessun altro si è trovato ad affrontare lo stesso problema?
Non è che è una limitazione della sorgente da cui vai a prendere il file ? Vedo un telnet client.
Prova ad usare come input un altro file e vedi se funziona.
mercury841
02-01-2009, 07:27
Non è che è una limitazione della sorgente da cui vai a prendere il file ? Vedo un telnet client.
Prova ad usare come input un altro file e vedi se funziona.
probabilmente è proprio questo il problema, quando vado a leggere da telnet i dati binari, non so perchè, alcuni dati vengono trasformati in altri. Infatti ho provato a ricopiare un file binario in un altro utillizzando la stessa procedura di sopra e il tutto funziona perfettamente. Non so che fare...
Probabilmente vengono cambiati i dati sotto 0x20 (sotto lo spazio), perché spesso rappresentano sequenze di escape per i terminali. In pratica si fa per evitare che succeda la stessa cosa che avviene sui terminali *nix quando si fa un cat di un file binario (vengono cambiati tutti i caratteri con simboli strani).
Purtroppo non so se ci sia qualcosa da fare...magari potendo manipolare le impostazioni del server, ma non ne ho idea.
^TiGeRShArK^
02-01-2009, 13:31
http://tools.ietf.org/html/rfc856
we have the rule that when a connection is not presently
operating in binary mode, the default (i.e., the interpretation of
WON'T and DON'T) is to continue operating in the current mode,
whether that is NVT ASCII, EBCDIC, or some other mode. This rule,
however, is not applied once a connection is operating in a binary
mode (as agreed to by both ends); this would require each end of the
connection to maintain a stack, containing all of the encoding-method
transitions which had previously occurred on the connection, in order
to properly interpret a WON'T or DON'T. Thus, a WON'T or DON'T
received after the connection is operating in binary mode causes the
encoding method to revert to NVT ASCII.
sembrerebbe che la connessione venga iniziata direttamente in binary mode dal server e che il tuo client non supporti la trasmissione binaria...
prova ad utilizzare qualche altra libreria per telnet e vedi se così risolvi...
oppure prova se puoi forzare il tuo telnet client attuale ad utilizzare la connessione in modalità binary.
mercury841
04-01-2009, 17:03
se provo a scaricare questi dati con il protocollo Kermit?
qualcuno sa spiegrami di cosa si tratta? in poche parole quando recupero questi dati binari posso scegliere la modalità tra "direct" e "kermit". Fino ad ora ho sempre utilizzato la prima modalità. Ho l'impressione che utilizzando, invece, il protocollo Kermit riuscirei a risolvere.
^TiGeRShArK^
04-01-2009, 17:33
se provo a scaricare questi dati con il protocollo Kermit?
qualcuno sa spiegrami di cosa si tratta? in poche parole quando recupero questi dati binari posso scegliere la modalità tra "direct" e "kermit". Fino ad ora ho sempre utilizzato la prima modalità. Ho l'impressione che utilizzando, invece, il protocollo Kermit riuscirei a risolvere.
il kermit dovrebbe supportare sia il trasferimento testuale che quello binario..
prova :p
mercury841
04-01-2009, 17:53
purtroppo non so come si usa.
mercury841
08-01-2009, 14:41
Effettivamente con il Kermit funziona, l'ho provato con l'HyperTerminal di win. Purtroppo però questa cosa la devo implementare in Java. come faccio ad utilizzare il kermit anche in Java?
In bocca al lupo:
http://www.faqs.org/rfcs/rfc2840.html
Il problema è trovare l'implementazione del protocollo kermit in Java.
mercury841
08-01-2009, 16:03
Potrei utilizzare un programma per effettuare il trasferimento con kermit standalone, e richiamarlo tramite java. Ne conoscete qualcuno?
banryu79
08-01-2009, 16:24
Se ti va bene un prodotto commerciale c'è questa libreria [JKermit] (http://serialio.com/products/jkermit.php).
Qui (http://en.wikipedia.org/wiki/Kermit_(protocol))info generiche da wikipedia ENG.
Prova a dare un occhio a C-Kermit (http://www.columbia.edu/kermit/ck80.html) o Kermit 95 (http://www.columbia.edu/kermit/k95.html).
Piuttosto che implementare il protocollo in Java potrebbe essere più abbordabile wrappare qualcosa di esistente e interfacciarsi mediante JNI.
@EDIT:
purtroppo la libreria standard della Sun lascia un po' a desiderare per quanto riguarda il supporto per il serialIO.
Inoltre, da quello che ho letto in giro, la tendenza per sviluppi futuri è orientata verso l'estensione del supporto a basso livello, non ad astrazioni maggiori, come appunto il protocollo Kermit.
mercury841
09-01-2009, 14:31
Ho trovato un programmino che mi permette di effettuare il download del file tramite protocollo Kermit. Però adesso non so come utilizzarlo tramite Java. In pratica riesco a lanciarlo, però mi blocco perchè non so come inviare dei comandi a questo proagramma. Ho provato anche a lanciarlo passandogli la socket su cui ho stabilito, precedentemente, la connessione telnet in questo modo: link (http://www.ezslookingaround.com/blog/tech/?no=958&npage). Però non mi funziona. Qualcuno ha qualche idea?
banryu79
09-01-2009, 15:26
Ho trovato un programmino che mi permette di effettuare il download del file tramite protocollo Kermit. Però adesso non so come utilizzarlo tramite Java. In pratica riesco a lanciarlo, però mi blocco perchè non so come inviare dei comandi a questo proagramma.
Beh, se lanci il programma da Java come processo esterno al massimo puoi passargli dei parametri da linea di comando; poi una volta partito il processo fa quello che deve.
Non è così?
mercury841
09-01-2009, 15:43
Beh, se lanci il programma da Java come processo esterno al massimo puoi passargli dei parametri da linea di comando; poi una volta partito il processo fa quello che deve.
Non è così?
Il programma lo utilizzo in questo modo:
lancio l'exe del programma
a questo punto parte un prompt dei comandi tramite il quale stabilisco una connessione telnet inviano il comando "telnet ip"
tramite una interfaccia testuale inserisco alcune informazioni
scarico il file in modalità Kermit
Come faccio a tradurre tutti questi passi in una porcedura java????
Cioè io riesco a lanciare l'exe da Java, ma poi come faccio ad inviare i successvi comandi al programma?
Più che un programma mi servirebbe una subroutine che mi permetta di eseguire il kermit su una conessione Telnet.
banryu79
09-01-2009, 16:17
Beh, da Java forse potresti lanciare cmd.exe come processo esterno; ti agganci all'inputstream e all'outputstream del tuo processo, e a quel punto passa in input all'outputstream del processo i comandi da eseguire.
Per saperne un po' di più prova a leggerti questi due vecchi topic (oppure fai una ricerca interna nel Forum con le keyword "Java" e "Process").
> [Java] Runtime (http://www.hwupgrade.it/forum/showthread.php?t=1515700&highlight=Java+Process)
> [JAVA] inputstream e outputstream di un processo (http://www.hwupgrade.it/forum/showthread.php?t=1619594)
@EIDT:
Come ultima spiaggia potrebbe essere sufficente creare al volo un .bat e lanciare quello, anche se come soluzione (ammesso funzioni) è un po' sporca.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.