java输入流,大字节,然后127

时间:2018-01-02 11:26:59

标签: java android c++ byte inputstream

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

但是当微芯片发送大于127的值(例如:字符á)时,我的textview显示意外的十六进制值(例如: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                
}

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

这是一个unicode编码问题。

character áiso8859字符集中编码为0xE1。所以它的值225大于127.

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

使用UTF-8中的8位表示编码相同的unicode字符,其中包含两个连续字节的序列: 0xC3 0xA1 。任何值为0x80和0xFF的unicode字符都将被转换为两个不同的字符。一些较大的unicode字符可以分割为更多字节,因为UTF-8是可变长度编码。

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

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