[RESOLVIDO]Conversão Caracteres UNICODE(java utf-8) para Tabela ASCII Estendida

Bom pessoal,
para contextualizar primeiro, preciso fazer que meu programa gere um arquivo que serve como um arquivo de validação para os programas da empresa onde eu trabalho, porém os programas são em VB6, peguei o programa antigo de gerar licenças e copiei a rotina do VB para uma classe minha… oque essa rotina faz, pega dois Array de int contendo os códigos ASCII de dois parâmetros recebidos, itera os dois Arrays e somando os valores com os índices, e a soma, ele pega o carácter da tabela ASCII e joga para uma string, que será gravada no arquivo ANSII. Porém o VB pega os caracteres da tabela US-ASCII estendida, e o cast do java ( (char) int ), porém não pega os mesmo caracteres.

Já tentei alterar a codificação do projeto. Tentei pegar os códigos hex de cada char. Fiz um programa no VB para gerar a tabela ASCII de 0 a 255 e joguei o resultado em um arquivo de propriedades, e busco nesse arquivo o char que eu preciso, foi a solução que cheguei mais próximo, porém alguns caracteres como o 157 que não tem nada, ele deu problema, tentei alterar as string correspondentes para os códigos \uXXXX do UNICODE e também não funcionou, dei uma olhada no Charset, CharsetEncoder e CharsetDecoder mas não consegui muito lidar com as APIs.

Alguém sabe de algo, já passou por isso, tem alguma luz para mim?
Obrigado.

Uma forma de trabalhar com isso é não usar strings, apenas arrays de bytes. Já pensou nisso?
É que strings estragam vários bytes, que são transformados em “?”.
Em vez de usar um FileWriter, use um FileOutputStream.

        import org.apache.commons.io.FileUtils;

        //Trecho da criação e gravação do arquivo
        File fileExportacao = new File("c:\\temp\\" + nomeArquivo);
        FileUtils.writeStringToFile(fileExportacao, conteudo);



        this.licenca = new DefaultStreamedContent(new FileInputStream(fileExportacao), "application/STA", nomeArquivo, "ANSII");

Ok, mas como eu vou pegar o int, e passar para byte equivalente sem usar String?

Boa pergunta. O int deveria ser gravado em sua representação binária de 4 bytes (ou 8 se for um long), ou em representação decimal? Não sei o que você precisa gravar :slight_smile:

então, o problema que eu nao posso gravar bytes, porque os softwares da empresa (em VB) que leem esses arquivos, leem as strings, fazem os processos inversos, e dão os splits para poderem fazer a validação referente ao modulo, cliente, etc

“Não posso” é uma palavra que não existe. O que você tem de fazer? Você tem um número 12345. Como é que ele tem de ser gravado no arquivo?

  1. Ele tem de ser gravado como “12345” (cinco bytes cujos códigos ASCII são 31, 32, 33, 34, 35 em hexa)
  2. Ele tem de ser gravado como os bytes 00 00 30 39
  3. Ele tem de ser gravado como os bytes 39 30 00 00

ACHO que consegui, vou testar com os outros modulos para confirmar

A princípio funcionou, testei com um cliente de padrão, os 3 módulos diferentes…

Valeu pela ajuda…
postarei o código aquii

GRAVAÇÃO:

         //Imports
         ...
         import org.apache.commons.io.FileUtils; 

       ...
       byte[][] conteudo = new GeradorLicencaSIM().encriptarDesencriptar(userKey.toString(), text.toString(), AcaoGeraradorLicencaSIM.ENCRIPTAR);


        //* Cria o arquivo a ser exportado
        File fileExportacao = new File("c:\\temp\\" + nomeArquivo);
        
        for (int indice = 0; indice < conteudo.length; indice++) {
                 FileUtils.writeByteArrayToFile(fileExportacao, conteudo[indice], true);
        }


        this.licenca = new DefaultStreamedContent(new FileInputStream(fileExportacao), "application/STA", nomeArquivo, "ANSI");

GERADOR DA LICENÇA:

        ...
        matrizByte[indice] = intToByteArray(somaVetoresChar);


  public byte[] intToByteArray(int a) {
    
  return new byte[]{
                (byte) ((a >> 24 ) & 0xFF),
                (byte) ((a >> 16 ) & 0xFF),
                (byte) ((a >> 8 ) & 0xFF),
                (byte) (a & 0xFF)
    };

}