You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Dart中正确读取外部设备的24位有符号整数?

解决Dart中读取24位有符号整数与Java结果不一致的问题

问题根源

Java的byte是有符号8位整数(范围-128127),当字节最高位为1时会被解析为负数;而Dart中`List<int>`存储的单个字节是**无符号8位整数**(范围0255),所以原本Java中显示为负数的字节,在Dart里会以正数形式呈现(比如0xFF对应255,而非-1),这就是两者表现差异的核心原因。

解决方案

1. 单个无符号字节转有符号字节

先把Dart中读取到的无符号8位值转换为有符号的,逻辑简单直接:若值大于127(最高位为1),则减去256得到对应的负数,否则直接返回原值。

int signedByte(int unsignedByte) {
  return unsignedByte > 127 ? unsignedByte - 256 : unsignedByte;
}

验证示例:

  • 输入255 → 返回-1(对应Java中的-1)
  • 输入250 → 返回-6(对应Java中的-6)
  • 输入3 → 返回3(与Java结果一致)

2. 解析24位有符号整数

根据设备的字节序(大端/小端),将转换后的3个有符号字节组合成24位有符号整数:

大端序(高位字节在前)

int parse24BitBigEndian(List<int> bytes, int startIndex) {
  int b1 = signedByte(bytes[startIndex]);
  int b2 = signedByte(bytes[startIndex + 1]);
  int b3 = signedByte(bytes[startIndex + 2]);
  
  return (b1 << 16) | (b2 << 8) | b3;
}

小端序(低位字节在前)

int parse24BitLittleEndian(List<int> bytes, int startIndex) {
  int b1 = signedByte(bytes[startIndex]);
  int b2 = signedByte(bytes[startIndex + 1]);
  int b3 = signedByte(bytes[startIndex + 2]);
  
  return (b3 << 16) | (b2 << 8) | b1;
}

使用示例

假设从设备读取的字节列表是[0x00, 0x00, 0xFF, 0xFA],要解析前3个字节组成的24位整数:

List<int> deviceData = [0, 0, 255, 250];
int result = parse24BitBigEndian(deviceData, 0);
print(result); // 输出-1,与Java结果一致

内容的提问来源于stack exchange,提问作者SciFi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:05:26