Autore Topic: Tabella ASCII completa  (Letto 1993 volte)

Offline andrea_g

  • Utente junior
  • **
  • Post: 58
  • Respect: +1
    • andreagorfer
    • @andreagorfer
    • Mostra profilo
    • Bondon's Crew
  • Dispositivo Android:
    Galaxy S3
  • Sistema operativo:
    Max OS X 10.9.2
Tabella ASCII completa
« il: 26 Agosto 2013, 20:29:23 CEST »
0
Come faccio a spedire un dato usando la tabella ASCII a 8 bit invece che a 7?
Devo spedire il dato esadecimale 0x80 che coincide al valore 128 in decimale. Come fare? Il comando lo attivo tramite un button:
Codice (Java): [Seleziona]
                                                        awnlight.setImageResource(R.drawable.awning_light_on);
                                                        fAwn = true;                   
                                                        m6=new char [8];
                                                        m6[0]=0x1E;
                                                        m6[1]=0x06;
                                                        m6[2]=0x00;
                                                        m6[3]=0x1E;
                                                        m6[4]=0x01;
                                                        m6[5]=0x80;
                                                        m6[6]=0xEB;
                                                        m6[7]=0x93;
                                       
                                                        // mando il messaggio settando i flag corretti

                                                        mtcpclient.fArrayLungo = true;
                                                        mtcpclient.fAttesa = false;
                                                        if(mtcpclient!=null)
                                                        {
                                                                mtcpclient.sendMessage(m6);
                                                        }                                              
                                                }
sfruttando una connessione TCP:
Codice (Java): [Seleziona]
import java.io.DataInputStream;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import android.util.Log;


public class TCPClient {
        String serverMessage;
    public static final String SERVERIP = "10.10.100.29";
    public static final int SERVERPORT = 8899;
    OnMessageReceived mMessageListener = null;
    private boolean mRun = false;
    public boolean fAttesa = true;
    boolean connected=false;
    PrintWriter out;
    InputStream in;
    Socket socket=null;
        DataInputStream is=null;
        PC320 op;
        float[] a = new float [7];
        int[] b = new int [8];
        public boolean fArrayLungo = false;
       
    //Constructor of the class. OnMessagedReceived listens for the messages received from server
        public TCPClient(OnMessageReceived listener)
    {
                mMessageListener = listener;
    }
     // Sends the message entered by client to the server
    public void sendMessage(char[] m)
    {
        if (out != null && !out.checkError())
        {
                out.write(m);
                out.flush();
        }    
    }
    public void stopClient()
    {
      mRun = false;
    }
    public void run()
    {
        mRun = true;
        try {
                        // Apre la connessione TCP
                InetAddress serverAddr = InetAddress.getByName(SERVERIP);
                Log.i("TCP Client", "C: Connecting...");
                socket = new Socket(serverAddr, SERVERPORT);
                connected=true;
               
                while (connected)
                {
                        try
                        {
                                Log.i("TCP Client","C:Sending command.");
                                out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
                                Log.i("TCP Client", "C: Sent.");
                                Log.i("TCP Client", "C: Done.");
                                in = socket.getInputStream();
                                while (mRun)
                                {  
                                        Log.i("TCP Client", "sono qui");
                                        while (fAttesa);
                                        int i = 0;
                                        // Se la richiesta proviene dai toggle button uso l'array b, se no l'array a.
                                        // viene fatto per una questione di lunghezza delle richieste.
                                        if (fArrayLungo==true)
                                        {
                                                for ( i = 0; i < b.length; i++)
                                                {
                                                        Log.i("TCP Client", "Sono nel ciclo for "+in.available());
                                                try
                                                {
                                                        b[i] = (short) in.read();
                                                }
                                                catch(Exception e)
                                                {
                                                        b[i] = 12345;
                                                }
                                                Log.i("TCP Client", "valore:"+ b[i] + " indice b:" + i + " len " + b.length);
                                                }      
                                                fAttesa = true;
                                        }
                                        else
                                        {
                                                for ( i = 0; i < a.length; i++)
                                                {
                                                        Log.i("TCP Client", "Sono nel ciclo for "+in.available());
                                                        try
                                                        {
                                                                a[i] = (short) in.read();
                                                        } catch(Exception e)
                                                                {
                                                                        a[i] = 666;
                                                                }
                                                        Log.i("TCP Client", "valore:"+ a[i] + " indice a:" + i + " len " + a.length);
                                                }
                                                fAttesa = true;
                                        }
                                        fArrayLungo = false;
                                        Log.i( "TCPClient" , "mmmmmmm");
                                        fAttesa = true;
                                }  
                        } catch (Exception e)
                        {
                                Log.e("TCP", "S: Error", e);              
                        } finally
                        {
                                socket.close();
                        }
                }
                } catch (Exception e)
                {
                        Log.e("TCP", "C: Error", e);
                        System.exit(1);
            }    
    }
    public interface OnMessageReceived
    {
        public void messageReceived(String message);
    }
}

Ora, come faccio a dirgli di usare la tabella ascii che mi spedisca, senza tramutarmelo, il valore 0x80?
Andrea

Offline matttt

Re:Tabella ASCII completa
« Risposta #1 il: 26 Agosto 2013, 23:18:27 CEST »
0
...
Ora, come faccio a dirgli di usare la tabella ascii che mi spedisca, senza tramutarmelo, il valore 0x80?
Cosa intendi di preciso?
Dove avviene il tramutamento?
Spedisci un array char, riceverai un array char...
Le mie apps su Google Play Store:

Offline andrea_g

  • Utente junior
  • **
  • Post: 58
  • Respect: +1
    • andreagorfer
    • @andreagorfer
    • Mostra profilo
    • Bondon's Crew
  • Dispositivo Android:
    Galaxy S3
  • Sistema operativo:
    Max OS X 10.9.2
Re:Tabella ASCII completa
« Risposta #2 il: 26 Agosto 2013, 23:24:13 CEST »
0
Succede che invece di spedire 0x80 spedisce 0xC2 o valori a caso. Provando con altri valori da 0 a 127 (decimale) funziona tutto mentre dal 127 in su no.
Facendo prove ed inserendo qualche Log.i abbiamo capito che usa solo la tabella da 0 a 127 e io necessito anche dell'altra parte di ascii. Penso che il problema risieda nel fatto che esplicito la codifica utf-8 solo nel Manifest e non qui. Dove potrei inserirla?
Andrea

Offline matttt

Re:Tabella ASCII completa
« Risposta #3 il: 26 Agosto 2013, 23:32:30 CEST »
0
Prova a mettere "byte" al posto di "char"
Le mie apps su Google Play Store:

Offline andrea_g

  • Utente junior
  • **
  • Post: 58
  • Respect: +1
    • andreagorfer
    • @andreagorfer
    • Mostra profilo
    • Bondon's Crew
  • Dispositivo Android:
    Galaxy S3
  • Sistema operativo:
    Max OS X 10.9.2
Re:Tabella ASCII completa
« Risposta #4 il: 26 Agosto 2013, 23:39:32 CEST »
0
se uso byte non posso applicare più il PrintWriter....
Andrea

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Tabella ASCII completa
« Risposta #5 il: 27 Agosto 2013, 02:03:45 CEST »
+1
I char in Java non sono come i char in C/C++. Java fino alla versione 1.5 usava i char (e di conseguenza anche le stringhe) Unicode codificati in UCS-2, quindi ogni carattere occupava esattamente 2 byte. Dalle ultime versione hanno sostituito la codifica UCS-2 con UTF-16, quindi lunghezza variabile e può occupare un multiplo di 2 byte.

Come ti è stato detto devi usare i byte e se tenti di stamparlo succedono degli imprevisti perché viene interpretato come un carattere UTF-16 leggendo anche il byte successivo e questo molto spesso è indeterminato e può non essere accessibile :)
adb logcat | tee /tmp/logcat | grep TAG

Offline andrea_g

  • Utente junior
  • **
  • Post: 58
  • Respect: +1
    • andreagorfer
    • @andreagorfer
    • Mostra profilo
    • Bondon's Crew
  • Dispositivo Android:
    Galaxy S3
  • Sistema operativo:
    Max OS X 10.9.2
Re:Tabella ASCII completa
« Risposta #6 il: 27 Agosto 2013, 09:30:33 CEST »
0
Quindi uso byte[]? Ok, però mi da errore nei caratteri letterali tipo 0xEA; (per esempio) e non posso usare printwriter. Come posso fare in alternativa?

Post unito: 27 Agosto 2013, 09:34:33 CEST
Anzi guardando qui http://it.wikibooks.org/wiki/Java/Tipi_di_dato direi addirittura che il byte è deleterio al mio scopo e char dovrebbe essere corretto. Il byte infatti ha un range compreso tra -128 e +127. A me serve il carattere +128  ???

Post unito: 27 Agosto 2013, 09:54:46 CEST
Ok, cercando cercando ho capito esattamente cosa devo fare, devo impostare l'uso della tabella UTF-16. Come posso fare?
« Ultima modifica: 27 Agosto 2013, 09:54:46 CEST da andrea_g, Reason: Merged DoublePost »
Andrea

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Tabella ASCII completa
« Risposta #7 il: 27 Agosto 2013, 10:18:56 CEST »
0
Potrei non aver capito, ma secondo me dipende da cosa ti serve fare: devi spedire il byte 0x80 o il carattere corrispondente in una ben precisa tabella di codifica caratteri (magari la cp1252 in cui 0x80 corrisponde a €)?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline andrea_g

  • Utente junior
  • **
  • Post: 58
  • Respect: +1
    • andreagorfer
    • @andreagorfer
    • Mostra profilo
    • Bondon's Crew
  • Dispositivo Android:
    Galaxy S3
  • Sistema operativo:
    Max OS X 10.9.2
Re:Tabella ASCII completa
« Risposta #8 il: 27 Agosto 2013, 10:23:48 CEST »
0
Io devo inviare il valore 0x80 e spedire esattamente quel valore. Allo stato attuale io imposto quel valore lì(come si vede dal codice) ma lui manda, visto lo standard UCF-8, 0xc2 0x80. Nella centralina ricevo, quindi, 0xC2 che coincide con un altro comando. La centralina di destinazione ragiona in esadecimale. Guardando le tabelle l'unica che soddisfa la mia richiesta è la ucf-16. Come impostarla?
Andrea

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Tabella ASCII completa
« Risposta #9 il: 27 Agosto 2013, 11:40:02 CEST »
0
Se devi spedire il byte 0x80 allora usa i byte.

Il problema di cui parlavi sopra, cioè del fatto che in Java non esistono unsigned, è irrilevante. A te non importa niente che 0x80 sia considerato da java come -127, perchè ti basta che sia spedito come 0x80 (cioè 10000000b).
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline andrea_g

  • Utente junior
  • **
  • Post: 58
  • Respect: +1
    • andreagorfer
    • @andreagorfer
    • Mostra profilo
    • Bondon's Crew
  • Dispositivo Android:
    Galaxy S3
  • Sistema operativo:
    Max OS X 10.9.2
Re:Tabella ASCII completa
« Risposta #10 il: 27 Agosto 2013, 11:41:32 CEST »
0
ok ora provo. Però come uso il printwriter con gli array di byte?

Post unito: 27 Agosto 2013, 11:43:45 CEST
adesso tutti i pacchetti simili a questo:
Codice (Java): [Seleziona]
m=new byte [8];
                                        m[0]=0x1E;
                                        m[1]=0x06;
                                        m[2]=0x00;
                                        m[3]=0x1E;
                                        m[4]=0x10;
                                        m[5]=0x40;
                                        m[6]=0xE7;
                                        m[7]=0x93;
me li da sbagliati ..scusate ma non ho mai lavorato con i byte[]  :-(

Post unito: 27 Agosto 2013, 11:57:05 CEST
Gli errori me li da sui m che superino o eguaglino il valore 128 decimale. Guarda caso dall'0x80 in poi...  :-[
« Ultima modifica: 27 Agosto 2013, 11:57:05 CEST da andrea_g, Reason: Merged DoublePost »
Andrea

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Tabella ASCII completa
« Risposta #11 il: 27 Agosto 2013, 12:48:58 CEST »
0
Se il problema è che printerwriter non prende i byte, prova ad usare la write() dell'outputstream.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline andrea_g

  • Utente junior
  • **
  • Post: 58
  • Respect: +1
    • andreagorfer
    • @andreagorfer
    • Mostra profilo
    • Bondon's Crew
  • Dispositivo Android:
    Galaxy S3
  • Sistema operativo:
    Max OS X 10.9.2
Re:Tabella ASCII completa
« Risposta #12 il: 27 Agosto 2013, 13:57:46 CEST »
0
Ora provo, ma una roba del genere è giusta per evitare l'errore?

Se non faccio quanto state per vedere mi dice che è impossibile convertire gli int con i byte... :-o

Codice (Java): [Seleziona]
        m=new byte [8];
                                                        m[0]=0x1E;
                                                        m[1]=0x06;
                                                        m[2]=0x00;
                                                        m[3]=0x1E;
                                                        m[4]=0x11;
                                                        m[5]=0x00;
                                                        m[6]=(byte) 0xE7;
                                                        m[7]=(byte) 0xF3;      
Andrea

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Tabella ASCII completa
« Risposta #13 il: 29 Agosto 2013, 16:22:50 CEST »
+1
In Java qualsiasi conversione che può perdere precisione deve essere esplicita, quindi per gli interi maggiori di 0x7F devi fare un cast se gli vuoi in byte. Tieni anche conto che in Java non esistono gli interi o i byte senza segno, quindi se scrivi '0xE7' è come se scrivessi '-0x19' (in decimale -25). Come ultima cosa Java deriva dal C++ che a sua volta deriva dal C quindi puoi istanziare e inizializzare un array di byte in questo modo con i numeri negativi per evitare il cast:

Codice (Java): [Seleziona]
byte m[] = {
        0x1E,
        0x06,
        0x00,
        0x1E,
        0x11,
        0x00,
        -0x19,
        -0x0D
};
adb logcat | tee /tmp/logcat | grep TAG