如何找到TIBCO Rendezvous消息的字节编码?

时间:2009-05-26 15:22:42

标签: java character-encoding nio tibco

在我的Java应用程序中,我将TIBCO RV消息作为字节存档到文件中。

我正在编写一个小实用程序应用程序,它将播放消息。这样我就可以从字节创建一个TibrvMsg对象,而不必解析文件并手动构造对象。

我遇到的问题是我正在读取在Linux机器上创建的文件,并试图在Windows机器上运行我的应用程序。由于文件写入了不同的字符集,我收到错误。

所以现在,我想要做的是将每条消息记录在特定的字符集(UTF-8)中,这样我就不在乎我在哪个平台上运行我的播放应用程序。应用程序应该只读取文件中的知识在此之前编写文件的字符集。我打算使用java.nio包来将字节从一个字符集转换为另一个字符集。

我是否需要知道编码TIBRV消息字节的字符集才能进行转换?如果是这样,我怎么能找到它?

5 个答案:

答案 0 :(得分:3)

您正在使用不透明数据,并且看起来会尝试将其作为文本数据写入文件,而不会转义它的非文本部分(或者您将其写为原始字节,然后尝试读取它就像它一样是基于字符的,这是同样的问题)。 这从一开始就存在缺陷。

不透明数据应被视为无意义,只需存储而无需修改即可返回知道如何处理它的API。如果数据必须以文本形式存储,那么您必须无损将字节转换为文本。适当的编码类似于base64。如果将字符集编码应用于原始二进制数据,则字符集编码意义上的编码不是无损的。

简单地将文件中的字节存储为 bytes (不是字符)以及指示消息长度和发送主题的固定长度前缀足以通过以下方式重播RV消息系统

如果编码很重要,那么对于消息中的任何基于文本的字段(我强烈建议在设计应用程序时一般都避免这种情况),那么你在重播时会遇到与原始收据时相同的问题。是从源编码转换为所需的编码(希望使用完全相同的代码)所以这应该是与重放相关的非问题。

答案 1 :(得分:1)

由于这个(诚然相当古老)mailing list message表明,对该网络协议的内部结构知之甚少。这可能会让你做的事情变得非常困难。

也就是说,如果消息只是二进制数据块(从网络捕获),它们甚至不应该有字符集。字符集用于文本数据,因为单个字符可以以多种不同方式编码。二进制数据不是由字符组成的,因此在这种意义上不能进行编码。

答案 2 :(得分:0)

这可能与Java字符串编码有关,而与TIBRV无关。虽然在文档中有这个:

Strings and Character Encodings 

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

Rendezvous software uses strings in several roles: 

* String data inside message fields
* Field names
* Subject names (and other associated strings that are not
  strictly inside the message)
* Certified delivery correspondent names
* Group names (fault tolerance)

All these strings (both in C and in wire format) use the character
encoding appropriate to the ISO locale of the sender. For example,
the United States is locale en_US, and uses the Latin-1 character
encoding (also called ISO 8859-1); Japan is locale ja_JP, and uses
the Shift-JIS character encoding. 

When two programs exchange messages within the same locale, strings
are always correct. However, when a message sender and receiver use
different character encodings, the receiving program must convert
between encodings as needed. Rendezvous software does not convert
automatically. 

EBCDIC 
For information about string encoding in EBCDIC environments,
see tibrv_SetCodePages() . 

所以你可能想看一下机器的语言环境。

答案 3 :(得分:0)

  

我需要知道什么是charset   TIBRV消息字节编码为   做转型?

是。字符集是一种将文本转换为字节流的方法,反之亦然。您的网络数据是一个字节流,因此当您将其中的部分内容解释为文本时,您(隐式或显式)使用字符集 - 问题是它是否是正确的。

将字节从一个字符集转换为另一个字符集基本上意味着使用一个字符集将它们转换为文本,然后使用另一个字符集转换回字节。请注意,这可能会导致数据长度发生变化,因为许多字符集对某些字符使用的字节数超过1个字节。在网络消息的上下文中,当它使长度字段无效或导致文本字段溢出时,这可能会有问题。最好不要进行任何转换,而是教读阅读应用程序学习如何处理不同的字符集。

  

如果是这样,我怎么能找到这个?

查看协议规范。

答案 4 :(得分:0)

从inputStream读取byte []中的所有内容,将byte []写入FileOutputStream。

不应该涉及读者或作者,他们进行角色转换,这是错误的。

远离java.nio,直到你理解java.io.