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

问题描述 投票:1回答:2

我有一个在微芯片上运行的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                
}
java android c++ byte inputstream
2个回答
0
投票

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

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


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编码,你应该在java端使用appropriate charset时使用opening the stream参数打开具有相同编码的流​​。

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

© www.soinside.com 2019 - 2024. All rights reserved.