java 输入流,字节大,然后是 127
java Inputstream with large byte then 127
我有一个在微芯片上运行的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 char
C++然后按原样使用 Java 代码。它必须起作用。基本上,当它在 C/C++ 中声明为char
时,系统会存储 2s 补码值。这就是问题所在。
- 从不同线程使用int64的不同字节安全吗
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 在UNIX系统中使用DIR查找文件的字节大小
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- boost::asio如何生成多个协同程序,然后加入它们
- std::当在256字节边界上写入整数时,流的奇怪行为
- 将 char[] 数组转换为字节,然后将字节转换为 int,反之亦然
- 将40个字节长的数据框从十六进制转换为二进制,然后转换为十进制
- 将整数向量转换为字节数组向量,然后调用每个字节数组
- java 输入流,字节大,然后是 127
- 将结构添加到字节向量,然后添加另一个
- 录制音频,存储在缓冲区中,然后通过PulseAudio将字节写入声卡
- 我可以克隆C++对象的字节,覆盖原始字节,然后将这些字节复制回来吗?
- 读取几个字节,跳过 N 个字节,然后再次读取几个字节.如何
- 编译lua代码,存储字节码,然后加载并执行它
- 正在将字节转换为char数组,然后再转换回来
- 将std::string转换为十六进制,然后将其存储在字节数组中