Tamanho da string em binário

5 respostas
D

Bom dia a todos…

Preciso determinar o tamanho de uma string e grava-lo em formato binário, esse tamanho em binário será concatenado no inicio da String que será enviada via socket.

O problema é que dependendo do tamanho da string, digamos qualquer tamanho entre 128 e 159, quando ele é recuperado pelo código de destino, ele entende como 63.

O código abaixo recebe uma string do prompt e grava em disco, fazendo exatamente o que descrevi acima, o mesmo código abre o arquivo e recupera o tamanho. Passando como parametro uma string de até 127 o tamanho será mostrado corretamente, acima disso e até 159 dará problema.

import java.io.*;

public class TesteBin{

public static void main(String[] args)throws Exception{

// GRAVAÇÃO
//pega o texto passado como parametro
StringBuffer sb = new StringBuffer(args[0]);

int axLen = sb.length(); // Determina o tamanho do parametro
int h = (axLen / 256); // Calcula o byte “alto”
int l = axLen - (h * 256); // Calcula o byte “baixo”

sb.insert(0 , (char) l); // Concatena
sb.insert(0 , (char) h); // Concatena

FileWriter out = new FileWriter(“teste.txt”); //cria o stream para o arquivo de saida

//escreve e fecha o arquivo

out.write(sb + “”);

out.close();

// LEITURA
BufferedReader in = new BufferedReader(new FileReader(“teste.txt”));

String temp = in.readLine();

//pega o primeiro char, transforma em int, recuperando o tamanho

System.out.println(Tamanho:[ + (int) temp.charAt(0) + ]);

System.out.println(Tamanho:[ + (int) temp.charAt(1) + ]);

//pega o resto da string e escreve na tela
System.out.println(“String:[” + temp.substring(2, temp.length()) + “]”);

}
}

Abaixo segue outro código, ele apresenta na tela uma sequencia de caracteres e os códigos pelos quais são representados, nele é possível ver a faixa problemática e também é possível ver que existem outras. No final desse código eu mostro o caracter ? e o seu byte, vejam que o número é 63, ou seja, grosseiramente falando o meu tamanho binário está sendo transformado no simbolo interração e quando ele é lido o código destino apresenta o código desse simbolo, no caso 63.

public class teste7 {

public static void main(String[] args) {

for (int i=100; i<200; i++) {

  int teste = i;
  int teste2 = 100 + i;

  char a = (char)teste;
  char b = (char)teste2;

  System.out.print("Int: " + teste + " - " + a + " | ");
  System.out.print("Int: " + teste2 + " - " + b);
  System.out.println();
}

System.out.println("=============================");
System.out.println("? = " + (char)63 );

}
}

Resumindo: Preciso fazer com que o “destino” entenda que o número, digamos 130, é 130 e não 63. Preciso que o número binário não seja interpretado pelo simbolo que ele representa.

Acho que a solução é simples, mas como o tamanho das strings produzidas é variável, só descobri o problema no dia D e hora H e por isso recorro a vocês, caso alguém já tenha enfrentado esse problema e já tenha uma solução.

Agradeço desde já.

5 Respostas

T
  1. Se for fazer isso, use um DataOutputStream para encapsular seu socket. Assim você pode concatenar o tamanho em binário facilmente, usando writeShort (se o tamanho for 2 bytes) ou writeInt (se o tamanho for 4 bytes). Ou mais facilmente, use writeUTF, que grava o tamanho da string e depois os dados.
kaique

Cara, não sei se ajuda muito eu falar isso, mas se essa sua implementação servirá para saber quais são os bytes de um determinado elemento, isso já existe pronto no Java. A classe chama-se DataOutputStream.
Mas, como falei antes, talvez isso não seja de ajuda, pois isso pode ser uma implementação de um trabalho de faculdade.
Qualquer coisa posta…

[]'s.

D

O writeUTF foi uma dica muito boa, é útil já que evita que eu mesmo tenha que calcular e montar o tamanho da string em binário, no entanto, ele tem o mesmo problema que a minha solução anterior, a diferença é que ao invés de mostrar o tamanho 63 no destino ele está mostrando um número bem maior, vou enviar uma pequena lista com o que foi enviado e o que foi entendido pela ferramenta.

Tamanho - Recebido
127 127 OK
128 8364 Falhou
129 65533 Falhou
159 376 Falhou
160 160 OK
318 318 Ok

Como vocês podem ver, antes do 128 e depois do 159 tudo vai bem, entre eles é que está o problema.

Abaixo está o trecho de código que usei para testar o writeUTF

DataOutputStream saida = new DataOutputStream(s.getOutputStream());

saida.writeUTF(mensagem);

saida.flush();

Apenas ratificando: O que preciso é isso mesmo, enviar na mensagem via socket, o tamanho dela em dois bytes binários que ficarão logo no inicio. O objetivo é que a aplicação saiba logo de cara qual o tamanho da mensagem que está sendo enviada pra ela.

Obs: Toda a aplicação já está funcionando, o único problema é quando a mensagem enviada calha de ter o tamanho de uma dessas faixas problemáticas como 130 por exemplo.

T

Para ler um DataOutputStream você precisa de um DataInputStream. OK?

D

Alterei o meu código que recebe os dados utilizando o DataInputStream, funcionou.

Irei testar na máquina que receberá os dados reais, espero que funcione, pois sobre ela não tenho nenhum controle.

Postarei depois o resultado desses testes.

Obrigado a todos pelas informações.

Criado 11 de outubro de 2007
Ultima resposta 11 de out. de 2007
Respostas 5
Participantes 3