我有一个在微芯片上运行的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
}
答案 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中找到此问题的解决方案。