微芯片C++程序发送高字节值,Android Java接收显示异常求助
解决Java中接收单字节十六进制数据显示异常的问题
我来帮你理清这个问题的根源,以及对应的解决方案:
核心问题:Java的byte是有符号类型
Java里的byte是有符号8位整数,范围是-128到127。当微芯片发送大于0x7F(也就是127)的字节时,比如0xA0,这个值在Java中会被解析成负数(0xA0的补码对应十进制-96)。当你直接把这个负数转成十六进制字符串时,Java会自动进行符号扩展,把它填充成32位整数,也就是0xFFFFFFA0,这就是你看到ffffffxx的原因。
你遇到的0xc3 0xa1是怎么回事?
你提到发送字符á时得到这两个字节,这是因为á在UTF-8编码中本身就是两个字节:0xC3 0xA1。如果你的微芯片是按UTF-8编码发送字符,那接收这两个字节是正确的结果;但如果微芯片是发送单字节的0xA0(比如ISO-8859-1编码下的á),那你需要确认微芯片的发送逻辑是否正确。
正确的处理方案
要正确显示每个单字节的十六进制值,你需要把每个有符号的byte转换成无符号的整数,再格式化为两位十六进制字符串。具体步骤如下:
- 接收字节数组时,记录实际读取的字节数(避免处理数组中未填充的默认值)
- 遍历每个字节,用
& 0xFF将其转换为0-255的无符号整数 - 把每个整数格式化为两位十六进制字符串(大写/小写可自行选择)
修正后的代码示例
if (input.available() != 0) { // 记录实际读取的字节数,避免处理数组中未被填充的部分 int bytesRead = input.read(receive_bytes); StringBuilder hexBuilder = new StringBuilder(); for (int i = 0; i < bytesRead; i++) { // 将有符号byte转换为无符号int int unsignedByte = receive_bytes[i] & 0xFF; // 格式化为两位十六进制,这里用大写,末尾加空格分隔 hexBuilder.append(String.format("%02X ", unsignedByte)); } // 去掉末尾多余的空格,设置到TextView textView.setText(hexBuilder.toString().trim()); }
额外说明
- 为什么
receive_bytes[i] & 0xFF能解决问题?0xFF是32位整数的0x000000FF,和有符号byte做按位与操作时,会把byte提升为32位整数,同时将高24位清零,只保留低8位的原始字节值,这样就得到了0-255的无符号数值。 - 如果你的微芯片确实是发送单字节的
0xA0,那用上面的代码处理后,就能正确显示A0;如果还是得到C3 A1,那说明微芯片发送的是UTF-8编码的á,需要调整微芯片的发送逻辑,改成发送原始单字节数据而非UTF-8字符。
内容的提问来源于stack exchange,提问作者S3jp4kCZE
相关产品推荐
相关产品推荐

