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

java Inputstream with large byte then 127

本文关键字:然后 字节 输入流 java      更新时间:2023-10-16

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

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

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

但是后来我得到:0xc3 0xa1,但文本视图仍然没有正确显示只有 1 个字节:0xa0

这是我接收的代码:

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

这是一个 unicode 编码问题。

字符á 在 iso8859 字符集中编码为0xE1。 因此,其值 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 端打开流时使用适当的字符集参数以相同的编码打开流。

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

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

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