Como posso encontrar a codificação de byte de uma mensagem TIBCO Rendezvous?

votos
1

Na minha aplicação Java, eu estou arquivando mensagens RV TIBCO para um arquivo como bytes.

Estou escrevendo um aplicativo pequeno utilitário que irá reproduzir as mensagens de volta. Dessa forma eu posso apenas criar um objeto TibrvMsg dos bytes sem ter que analisar o arquivo e construir o objeto manualmente.

O problema que estou tendo é que eu estou lendo um arquivo que foi criado em uma caixa de Linux, e tentar executar o meu aplicativo em uma máquina Windows. Eu recebo um erro devido à diferente charset o arquivo foi escrito em.

Então, agora, o que eu quero fazer é entrar cada mensagem em um charset específico (UTF-8), de modo que eu não me importo que plataforma eu executar o meu aplicativo de reprodução. O aplicativo deve apenas ler o arquivo sabendo de antemão o conjunto de caracteres do arquivo é gravado. Eu estou pensando em usar pacotes java.nio para isso, para transformar o bytes de um charset para outro.

Preciso saber o que charset o TIBRV bytes de mensagens são codificados em fazer a transformação? Se assim for, como posso descobrir isso?

Publicado 26/05/2009 em 16:22
fonte usuário
Em outras línguas...                            


5 respostas

votos
3

Você está tomando os dados opaco e, ao que parece, tentar escrevê-lo em um arquivo como dados textuais sem escapar as partes não textuais dele (alternativamente você está escrevendo-lo como bytes brutos e depois tentar lê-lo como se fosse baseada em caracteres que é muito mais o mesmo problema). Esta é falho desde o início.

Opaco dados devem ser tratados como sem sentido e simplesmente armazenados sem modificação para dar a volta a uma API que sabe como lidar com isso. Se os dados devem ser armazenados em uma forma textual, então você deve losslessly converter os bytes em texto. Codificações apropriadas são coisas como base64. Codificação no sentido da codificação do conjunto de caracteres não é sem perdas se você aplicá-lo a dados binários brutos.

Basta armazenar os bytes em um arquivo como bytes (não caracteres), juntamente com um prefixo de comprimento fixo que indica o comprimento da mensagem eo assunto foi enviado em é suficiente para reproduzir mensagens de RV através do sistema.

Em relação a quaisquer campos baseados texto dentro da mensagem se os assuntos de codificação (eu sugiro fortemente evitar este importando em geral na concepção do app), então você tem o mesmo problema na repetição como você teria no momento recibo original que é para converter a partir da codificação de origem para a codificação desejada (espero usando exatamente o mesmo código) para que este deve ser um problema não em relação ao repetindo.

Respondeu 26/05/2009 em 18:04
fonte usuário

votos
1

Como este (reconhecidamente em vez de idade) mensagem lista indica, pouco se sabe sobre a estrutura interna do que o protocolo de rede. Isso pode torná-lo um grande desafio para fazer o que você está depois.

Dito isto, se as mensagens são apenas blocos binários de dados (como capturado a partir da rede), não devem mesmo ter um charset. Charsets é para dados textuais, onde importa uma vez que um único caractere podem ser codificados em muitas maneiras diferentes. Os dados binários não é composto de personagens, de modo que não pode haver uma codificação nesse sentido.

Respondeu 26/05/2009 em 16:28
fonte usuário

votos
0

Leia tudo o inte um byte [] de uma inputStream, escrever o byte [] para aa FileOutputStream.

Nenhum leitor ou escritor deve ser envolvido, eles fazem a conversão de caracteres e isso é errado.

Fique longe de java.nio até você entender java.io.

Respondeu 26/05/2009 em 19:45
fonte usuário

votos
0

Preciso saber o que charset o TIBRV bytes de mensagens são codificados em fazer a transformação?

Sim. Um conjunto de caracteres é um método de transformação de texto para uma corrente de bytes e vice-versa. Seus dados de rede é um fluxo de bytes, por isso, quando você interpreta partes dele como texto, que está (implícita ou explicitamente), utilizando um conjunto de caracteres - a pergunta é se é a correta.

Transformando bytes de um charset para outro, basicamente, significa convering-las para texto usando um charset e depois voltar para bytes utilizando outro. Note que isso pode resultar no comprimento da mudança de dados, uma vez que muitos charsets usar mais de 1 byte para alguns personagens. No contexto das mensagens de rede, isso poderia ser problemático quando se invalida campos de comprimento ou faz com que os campos de texto a transbordar. É provavelmente melhor não fazer qualquer transformação e, em vez ensinar o aplicativo de leitura para aprender a lidar com conjuntos de caracteres diferentes.

Se assim for, como posso descobrir isso?

Olhar para a especificação do protocolo.

Respondeu 26/05/2009 em 16:46
fonte usuário

votos
0

Isso provavelmente está relacionado com a string codificação Java, não TIBRV. Embora não há isso na documentação:

Cordas e Codificação de caracteres 

-------------------------------------------------- ------------------------------

software Rendezvous usa cordas em vários papéis: 

* Dados de corda dentro campos de mensagem
* Os nomes de campo
* Os nomes Assunto (e outras cordas associados que não são
  estritamente dentro da mensagem)
* Os nomes correspondentes entrega Certificado
* Os nomes de grupos (tolerância a falhas)

Todas estas cordas (ambos em C e em formato de arame) usar o caractere
codificação apropriado para a localidade ISO do remetente. Por exemplo,
os Estados Unidos é en_US locale, e usa o caractere Latin-1
codificação (também chamado ISO 8859-1); O Japão é ja_JP localidade e usos
a codificação de caracteres Shift-JIS. 

Quando dois programas de troca de mensagens dentro da mesma localidade, cordas
são sempre correta. No entanto, quando um remetente da mensagem e uso receptor
codificações diferentes de caracteres, o programa de recepção deve converter
entre as codificações, conforme necessário. software Rendezvous não converte
automaticamente. 

EBCDIC 
Para obter informações sobre a codificação de corda em ambientes EBCDIC,
veja tibrv_SetCodePages (). 

Então você pode querer olhar para o local das máquinas.

Respondeu 26/05/2009 em 16:30
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more