Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    68

    Problemi di comunicazione ASCII

    Salve a tutti, per lavoro devo creare una applicazione android che cominca con una centralina, il problema è che i dati vanno codificati in caratteri ASCII, ma per esempio il valore 128 o superiori non vengono codificati correttamente, potete aiutarmi?
    Inoltre, quando invio un array di char alla centralina, il java aggiunge sempre 2 caratteri finali, che tradotti sarebbero '\n' e '\r', c'è modo per non inviarli?

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Re: Problemi di comunicazione ASCII

    Originariamente inviato da Maxton
    ma per esempio il valore 128 o superiori non vengono codificati correttamente
    Che tradotto, significa?

    Inoltre, quando invio un array di char alla centralina, il java aggiunge sempre 2 caratteri finali, che tradotti sarebbero '\n' e '\r', c'è modo per non inviarli?
    Quello è il terminatore di linea utilizzato dai sistemi Windows. Semplicemente, invece di usare la versione "ln" dei metodi usa quella che non aggiunge il terminatore di linea. Ma senza sapere in che modo effettui l'invio è dura darti consigli. Supponendo che tu usi un PrintWriter:

    codice:
    PrintWriter pw = ...;
    
    // Tu probabilmente usi questo metodo:
    pw.println( dati );
    
    // Invece dovresti usare questo:
    pw.print( dati );
    pw.flush();
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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

    Re: Problemi di comunicazione ASCII

    Originariamente inviato da Maxton
    per esempio il valore 128 o superiori non vengono codificati correttamente, potete aiutarmi?
    128 non è ASCII ... dipende da cosa è per te o comunque da cosa ti aspetti che un codice 128 vada a rappresentare.

    Originariamente inviato da Maxton
    Inoltre, quando invio un array di char alla centralina, il java aggiunge sempre 2 caratteri finali, che tradotti sarebbero '\n' e '\r', c'è modo per non inviarli?
    Dipende o da dove arriva la stringa e/o, più presumibilmente, da come invii la stringa (con quale API).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    68
    ad esempio, secondo questa tabella
    http://www.signormicio.com/Images/tabella-ascii.gif
    il simbolo 'ç' è 128, ma la centralina riceve invece 231.

    Si uso il PrintWriter, grazie per questa dritta.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    68
    per la precisione uso questo codice
    codice:
    char[] arrayChar = new char[6];
    		
    		arrayChar[0] = 126;
    		arrayChar[1] = 127;
    		arrayChar[2] = 128;
    		arrayChar[3] = 129;
    		arrayChar[4] = 130;
    		arrayChar[5] = 131;
    		
    		System.out.println(arrayChar);
    		PrintWriter toServer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true); 	
    		
    		toServer.println(arrayChar);

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    68
    allora credo di aver capito meglio il mio problema, la codifica è errata perchè usa solo 7 bit e poi ha valori sui. Quindi ho pensato di trasmettere direttamente in byte e i numeri superiori a 127 li trasformo nel loro equivalente negativo in complemento a 2, cioè faccio valore-256, ora mi sorge un ulteriore problema, non mi funziona il codice

    ho creato questa classe
    codice:
    public class Convertitore 
    {
    
    	public static int CONVERSORE = 256; 
    	
    	public byte ConvertitoreValore(int i)
    	{
    		if (i>127) return (byte) (i-CONVERSORE);
    		else return (byte) i;	
    	}
    	
    }
    e l'ho usata in questo modo
    codice:
    public void Connessione(String ip, int port) throws UnknownHostException, IOException 
    	{
    		Socket	socket	= new Socket(ip, port);
    
    		if ( socket.isConnected()) System.out.println("Connection established");
    		else System.out.println("Connection	not established");
    		
    		byte[] arrayChar = new byte[6];
    
    		arrayChar[0] = valore.ConvertitoreValore(128);
    		arrayChar[1] = (byte) valore.ConvertitoreValore(129);
    		arrayChar[2] = (byte) valore.ConvertitoreValore(3);
    		arrayChar[3] = (byte) valore.ConvertitoreValore(128);
    		arrayChar[4] = (byte) valore.ConvertitoreValore(128);
    		arrayChar[5] = (byte) valore.ConvertitoreValore(128);
    		
    		
    		System.out.println(arrayChar);
    		System.out.println((byte) arrayChar[1]);
    		System.out.println((byte) arrayChar[5]);
    
    		PrintWriter toServer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
    		BufferedReader fromServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    
    		toServer.print(arrayChar);
    		toServer.flush();
    		
    		socket.close();
    	}
    ora mi da i seguenti errori
    codice:
    Exception in thread "main" java.lang.NullPointerException 
    at connessione.ConnessioneSocket.Connessione(ConnessioneSocket.java:29) 
    at connessione.Activity.main(Activity.java:14)
    dopo la riga di codice
    codice:
    arrayChar[0] = valore.ConvertitoreValore(128);
    avete idea del motivo?

  7. #7
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Chi lo istazia l'oggetto valore? (nessuno pare...)
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    68
    giusto, comunque non riesco a trovare il modo di inviare un simbolo ASCII con valore superiore al 127

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    68
    ok, dopo numerosi tentativi l'unica cosa che mi viene in mente è quella di creare un byte partendo da zero, è possibile?

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    devi trasmettere delle informazioni dal punto A al punto B (e fino a qui nessun problema)

    osservazione numero uno: la natura dei dati che pensi di dover trasmettere, quale è?
    In genere su comunicazioni si parla di byte trasmessi. Nel caso in cui gli end point conoscano la "natura" delle info che invii (es. tu ti trovi ad inviare SEMPRE e SOLO testo) allora ci sono delle API che ti facilitano l'invio delle informazioni.

    osservazione numero due: mai sentito parlare di charset? tieni conto che tu stai facendo una ipotesi molto restrittiva: inviare sempre e comunque del testo ASCII, ma non sei sicuro che gli endpoint parlino in ASCII (in parole povere, interpretino correttamente quel byte).

    Il fatto che sei già arrivato a dover trasmettere 128 significa che hai dei caratteri di testo che vanno oltre l'ASCII.

    osservazione numero tre: invia delle sequenze di byte che poi interpreti, perché questo è un approccio misto in cui se sai interpretarlo in ASCII bene, altrimenti si fanno paciocchi strani e n on sai che viene fuori.
    In genere non si fanno maneggi su parte del flusso, perché la controparte deve poterlo interptretare e devi dare una chiave di lettura unica, così facendo crei solo confusione
    RTFM Read That F*** Manual!!!

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.