long.parselong(string, 16)仅接受纯小写十六进制字符串(如"fffe"),需预处理去除"0x"前缀、转小写、清除空白;解析后若为补码负值,须手动符号扩展;务必try-catch异常。

直接用 Long.parseLong(String, int) 解析传感器返回的十六进制字符串时,必须确保输入格式合法——它**不接受 "0x" 前缀、不接受大小写混用的字母(如 "aF")、也不处理补码负值**。硬件传感器常以纯十六进制字符串(如 "fffe")或带前缀的字节流形式输出原始值,需按实际场景预处理后再解析。
确认传感器输出的真实格式
先抓取原始响应,观察是否含前缀、空格、换行或分隔符:
- 若返回
"0xfffe"或"0XAB12":需去掉"0x"或"0X"前缀,再转小写(Long.parseLong()只认 a–f,不认 A–F) - 若返回
"ff fe ab 12"(空格分隔):先replaceAll("\s+", "")清除所有空白 - 若返回字节数组(如
byte[]{(byte)0xFF, (byte)0xFE}):不能直接传给parseLong,需先转为十六进制字符串(推荐用String.format("%02x", b)拼接)
正确调用 parseLong() 并指定基数 16
只传纯十六进制字符(0–9, a–f),基数写 16:
String raw = "fffe"; // 传感器原始值,无前缀、小写 long value = Long.parseLong(raw, 16); // → 65534
若原始为大写,务必先转小写:
String raw = "FFFE"; long value = Long.parseLong(raw.toLowerCase(), 16); // ✅
错误示例(会抛 NumberFormatException):
Long.parseLong("0xfffe", 16); // ❌ 含 "0x"
Long.parseLong("FFFE", 16); // ❌ 大写字母(JDK 8+ 允许,但旧版本不保证)
处理有符号十六进制值(如传感器用补码表示负温度)
Long.parseLong() 总是按无符号解析。若传感器用 16 位补码输出(如 "fffe" 表示 -2),需手动转为有符号值:
- 确定原始位宽(常见:8/16/32 位)
- 解析后,用位运算截断并扩展符号位。例如 16 位补码:
String hex = "fffe"; // 传感器原始值
long uval = Long.parseLong(hex, 16); // 无符号值:65534
long sval = uval & 0xFFFF; // 保留低 16 位
if ((sval & 0x8000) != 0) { // 最高位为 1 → 负数
sval = sval | 0xFFFFFFFFFFFF0000L; // 符号扩展到 long
}
// sval 现在是 -2
健壮性建议:加异常捕获与日志
传感器通信可能出错,返回非十六进制内容(如超时乱码 "ERR" 或空字符串),务必包裹 try-catch:
try {
String cleanHex = sensorRaw.trim().toLowerCase().replace("0x", "");
long parsed = Long.parseLong(cleanHex, 16);
// 后续处理...
} catch (NumberFormatException e) {
Log.e("Sensor", "Invalid hex: '" + sensorRaw + "'", e);
// 返回默认值或触发重试
}










