如何在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"); }
代码说明
- 长度计算:用
~运算符做整数除法,确保得到准确的字节长度(避免浮点数问题) - 字节解析:循环截取每两个十六进制字符,通过
int.parse指定基数16转换为字节值,填充到Uint8List中 - 格式输出:如果只需要类似JS的简洁输出,直接打印
ArrayBuffer(${长度});如果需要查看具体字节数据,直接打印Uint8List即可
内容的提问来源于stack exchange,提问作者Aa Maulana
相关产品推荐
相关产品推荐

