Unicode

Boa tarde pessoal,

estou desenvolvendo um software para fazer algumas leituras em uma impressora fiscal.

Bom o protocolo da impressora funciona com o envio de strings para porta serial. Até ai tranquilo =)

Bom o fato é que ao final de cada string eu preciso enviar um caracter de checksum. O checksum é obtido através da soma dos bytes de cada caracter da string divido (módulo) por 256. Até aqui tranquilo também.

public class NewClass {

public static void main (String[] args) { 
    char stx = '\u0002'; // Fixo               
    char etx = '\u0003'; // Fixo
    char seq = '\u002a'; // Fixo
    String dados = "15"; // Variável
    int dadosSoma = 0;
    for (int i = 0; i < dados.length(); i++) {
        dadosSoma += (int) dados.charAt(i);
    }
    int checkSum = (((int) stx) + ((int) etx) + ((int) seq) + dadosSoma) % 256;
    System.out.println(checkSum);        
}   

}

Meu checkSum nesse caso dá 149.

Bom aqui começam os meus problemas. Digitando ALT+0149 eu obtenho o caracter de checkSum que nesse caso é ? (bolinha preta caso não consigam visualizar). Em java isso seria representado pelo "unicode" \u2022

Bom minha dúvida é como sair do 149 e chegar no \u2022, ou seja como converter o 149 -> ? (bolinha preta) -> \u2022 ou se existir um meio de converter o 149 -> \u2022

Obrigado antecipadamente por qualquer dica ou ajuda!!

Giu

Sendo chato mesmo, será que você não pode trabalhar com arrays de bytes, em vez de strings? Uma hora acaba acontecendo um problema desses, que é difícil de resolver.

Você se refere a trabalhar com arrays de bytes ao enviar para porta serial?

Isso na verdade é o que eu já faço.

Vamos lá.

Digamos que você tenha a seguinte string para mandar

ESC + "P" + "[" + "033;" + "Teste"

(onde ESC = ‘\u001B’). A comunicação serial quer que você mande também um caracter que seja a soma dos bytes.

Primeiramente, vamos achar a soma dos bytes:

byte calcularChecksum (final byte[] bytes) {
    int n = 0;
    for (int i = 0; i < bytes.length; ++i) n += bytes[i];
    return (byte) n;
}

E a seguir vamos converter a tal string em um array de bytes e pôr o tal caracter de checksum:

byte[] converte (final String s) {
    byte[] bytes = s.getBytes();
    byte[] bytesAndChecksum = new byte[bytes.length + 1];
    System.arraycopy (bytes, 0, bytesAndChecksum, 0, bytes.length);
    bytesAndChecksum[bytes.length] = calcularChecksum (bytes);
    return bytesAndChecksum;
}

É claro que você pode otimizar meu código, é só um exemplo para você entender. Por exemplo, estou efetuando N vezes a operação custosa de converter uma string para bytes.

Entendi o que você quer dizer :slight_smile:

Como eu disse eu já faço isso mas em uma etapa posterior, convertendo a minha “String” para bytes ao enviar para serial.

Vou fazer umas modificações pra trabalhar dessa forma!!

Por enquanto obrigado pela ajuda!!

Giu