Compatibilidade JAVA/C?

11 respostas
S

Salve!! Podem me ajudar numa dúvida conceitual?
Sabemos, segundo http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html que java usa o padrão UNICODE(16 bits) para seus caracteres e, que JAVA é descendente da Lingagem C não é nenhuma novidade também.

Só que C usa o padrão ASCII(posso estar enganado, mas em http://pt.wikipedia.org/wiki/Linguagem_C diz que esta usa 8 bits para os chars e não 16 como em JAVA que é unicode). Como fazer que estas duas tecnologias sejam compatíveis?

Estudo de Caso:
Estou fazendo um sistema que tem parte em pcs e parte em placas controladas por microcontroladores ( espécie de computador imbutido num único chip). A parte PC é java, e a parte dos microcontroladores é programada em C. A idéia, era fazer que a placa controle dispositivos eletrônicos a partir de strings passadas do computador ( que faz a GUI). Chegando na placa via serial, o microcontrolador tenta interpretar essa string e faz determinadas ações segundo as ordens passadas. Agora, se eu passo um caractere em java, eu envio 16 pulsos ao invez de 8. O controlador recebe 16 pulsos e intende como 2 caracteres! Como fazer que essas duas tecnologias sejam compatíveis?

Tem alguma classe que converta UNICODE->ASCII?

Obrigado a todos!! :smiley:

11 Respostas

S

ninguem faz idéia?

T

Não use strings e sim arrays de bytes. Faça a conversão de strings para arrays de bytes no próprio Java, que é mais simples. Exemplo:

void native RotinaEmC (byte[] bytes); // isto você codifica usando JNI em C
void RotinaEmJava (string str) {
    RotinaEmC (str.toByteArray ("ISO-8859-1"); // a conversão de strings para arrays de bytes é feita pelo Java
}
S

Obrigado! O problema é que estou usando a biblioteca RXTX para comunicação serial, e ela recebe como parâmetro uma string. E agora?

S

bom, modifiquei o método de envio para aceitar bytes… mas qndo eu envio os bytes e jogo na tela pra ver o que eu to enviando a string:
L2Liga fica: [B@e0e1c6
??? pq isso?

T

Você precisa converter de volta o array de bytes para uma string. O método “toString” dos arrays mostra exatamente isso, portanto você tem de usar o construtor de String que aceita um array de bytes
(ou seja,

byte[] bytes = ...
String s = new String (bytes, "ISO-8859-1");
fantomas

Desculpe o chute thingol e shamanpyro mas e se você transformasse essa lista de bytes em uma lista de caracteres hexa? Acho que dessa maneira vc consegue passar a lista em forma de strings.

O problema que eu vejo nessa minha idéia é vc ter que converter a lista de hexas em bytes novamente no microcontrolador isso vai aumentar seu código e consequentimente aumentar o consumo de memória.

S

Muito obrigado!

funcionou pra mostrar na tela direitinho. Mas, vejo que fiz errado: para converter pra array de Bytes useu getBytes fiz da senguinte forma:

String Ordem = "L2Liga"; // a ordem a ser excecutada
serialEscrita.EnviarUmArrayDeByte(Ordem.getBytes());

public void EnviarUmArrayDeByte(byte[] msg){ // não se preocu
               try{
 saida = porta.getOutputStream();
                System.out.println("FLUXO OK!");
            } catch (Exception e) {

                System.out.println("Erro.STATUS: " + e );

            }

            try {
                    String s = new String(msg,"ISO-8859-1");
                System.out.println("Enviando um byte para " + Porta );

                System.out.println("Enviando : " + s );

               
                saida.write(msg);

                Thread.sleep(100);

                saida.flush();

            } catch (Exception e) {

                System.out.println("Houve um erro durante o envio. ");

                System.out.println("STATUS: " + e );

                System.exit(1);

            }

        } else {

            System.exit(1);

        }

}

Eu tinha pensado que esse iSO-8859-1 que vc citou em

<blockquote>

void native RotinaEmC (byte[] bytes); // isto você codifica usando JNI em C

void RotinaEmJava (string str) {

RotinaEmC (str.toByteArray (“ISO-8859-1”); // a conversão de strings para arrays de bytes é feita pelo Java

}

</blockquote> era a String a ser convertida
S

Desculpe o chute thingol e shamanpyro mas e se você transformasse essa lista de bytes em uma lista de caracteres hexa? Acho que dessa maneira vc consegue passar a lista em forma de strings.
tipo, o pic que eu to usando é o 16f628A, ele não é tão fraco assim de memória, mas ainda sim é muito limitada. Fiz mo trampo pra diminuir os procesos: consegui fazer duas comparações pra ligar uma lampada ou ventilador, contra 10 feitas pelo concorrente ;), além da minha string ter 4 dígitos e a dele 12 Oo… Fiz todo esse esforço pq java é um pouco mais lento então to tetando compensar no processamento do pic. Mas, obrigado pela sugestão, testarei ela e verei qual tem melhor desempenho ^^.

A propósito: eu não consegui usar o toByteArray… precisa de algum jar?

S

Obrigado a todos pela ajuda :smiley:

ViniGodoy

Uma coisa que me deixou decepcionado com o Java é o fato das classes de stream ou channel não terem métodos para integrar com C, em especial, métodos para transmitir ou receber dados unsigned.

S

realmente, to tendo que fazer um protocolo só pra isso funcionar oO. Terminando eu disponibilizo aqui. ( protocolo é meio forçado, é mais uma funçãozinha XD… pq convertendo passa os dados de boa eu acho)

Criado 12 de agosto de 2008
Ultima resposta 12 de ago. de 2008
Respostas 11
Participantes 4