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

如何在Dart/Flutter中从十六进制字符串生成ArrayBuffer?

在Dart中从十六进制字符串生成对应ArrayBuffer的实现方法

需求说明

你需要在Dart中实现和以下JavaScript代码等价的功能:从十六进制字符串生成对应长度的ArrayBuffer,且输出格式类似JS的ArrayBuffer(xx)形式。

JavaScript参考代码:

const hexEncoded = "76e7480b836359dfa28aa59bccf11e824717a2ae9ea5e09947753b6fecf0d3cd";
const arrBuf = new ArrayBuffer(hexEncoded.length/2);
console.log("arrBuf ", arrBuf); 

这段代码会生成一个长度为32的ArrayBuffer,输出显示为arrBuf ArrayBuffer(32)。

你的问题

你尝试用Dart的Uint8List实现,但仅初始化了对应长度的空列表,未填充十六进制解析后的字节数据,导致输出全为0:

var arrBuf = Uint8List((hexEncodedData.length / 2).ceil());
print("arrBuf ${arrBuf}");

输出结果:arrBuf [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

解决方案

Dart中Uint8List是ByteBuffer的视图,等价于JS中基于ArrayBuffer的Uint8Array。要实现需求,需要完成十六进制字符串解析填充和自定义输出格式两步:

完整Dart代码:

void main() {
  const hexEncodedData = "76e7480b836359dfa28aa59bccf11e824717a2ae9ea5e09947753b6fecf0d3cd";
  
  // 计算字节长度(每2个十六进制字符对应1个字节)
  final byteLength = hexEncodedData.length ~/ 2;
  final uint8List = Uint8List(byteLength);
  
  // 遍历解析每个十六进制字节对
  for (int i = 0; i < byteLength; i++) {
    final start = i * 2;
    final hexByte = hexEncodedData.substring(start, start + 2);
    uint8List[i] = int.parse(hexByte, radix: 16);
  }
  
  // 输出类似JS ArrayBuffer的格式
  print("arrBuf ArrayBuffer(${uint8List.length})");
  
  // 如需查看具体字节值,直接打印Uint8List即可
  print("具体字节数据: $uint8List");
}

代码说明

  1. 长度计算:用~运算符做整数除法,确保得到准确的字节长度(避免浮点数问题)
  2. 字节解析:循环截取每两个十六进制字符,通过int.parse指定基数16转换为字节值,填充到Uint8List中
  3. 格式输出:如果只需要类似JS的简洁输出,直接打印ArrayBuffer(${长度});如果需要查看具体字节数据,直接打印Uint8List即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:31:23