java 大字节然后是 127 的输入流

java Inputstream with large byte then 127

我在发送字节 (0x30 0x98 0xa7 ...) 的微芯片上有一个 C++ 程序 运行。我在 android Java 应用程序中接收它们,该应用程序将这些字节以十六进制形式写入文本视图。

但是当微芯片发送大于 127 的值时(例如:字符 á),我的文本视图显示意外的十六进制值(例如:ffffffc3 ffffffa1)。这是个问题,因为我想要像 0xa0 这样的值。 所以我在值大于 127 时尝试了这个:

pole[i] = receive_bytes[i] & 0xff;

但后来我得到:0xc3 0xa1,但 textview 仍然无法正确显示只有 1 个字节:0xa0

这是我的接收代码:

if(input.available() != 0)
{                       
     input.read(receive_bytes); //receive_bytes is array byte                
}

我评论的声望较低,所以我在这里发表评论。

我认为您必须在 Microchip 的 C++ 程序中将字节数组声明为 unsigned char,然后按原样使用 Java 代码。它必须工作。基本上在C/C++中声明为char时,系统存储的是2s的补码值。这就是问题所在。

这是一个 unicode 编码问题。

character á is encoded as 0xE1 in iso8859 字符集。所以它的值225大于127。

在unicode中,用相同的值0x000000E1编码。它可以使用 UTF-32 或 UTF-16 编码作为单个字符处理,因此使用 32 位或 16 位表示。

相同的 unicode 字符在 UTF-8 中使用 8 位表示法进行编码,具有两个连续字节的序列:0xC3 0xA1。值介于 0x80 和 0xFF 之间的任何 unicode 字符都将被转换为两个不同的字符。一些较大的 unicode 字符可以拆分为更多字节,因为 UTF-8 是一种可变长度编码。

遗憾的是,很难提供更精确的诊断,因为不清楚您如何发送数据,也不清楚您如何接收数据。但是,如果您在 C++ 端使用 8 位 8859 编码,则应在 java 端使用 appropriate charset parameter when opening the stream 打开具有相同编码的流​​。

即使 Java 字符串中的值正确,默认情况下使用 UTF-8 的 TextView 仍然可能存在问题。您可以在 this other Whosebug answer 中找到此问题的解决方案。