【问题标题】:Dart: Parsing byte data to a stringDart:将字节数据解析为字符串
【发布时间】:2022-06-19 17:34:25
【问题描述】:

我有以下代码。我要做的是解析 BLE 服务数据以获取 EddyStone NamespaceInstanceID。是将字节数据解析成字符串。

import 'dart:typed_data';
import 'dart:convert';

main(){
    var list = [0, 2, 46, 80, 128, 106, 163, 130, 85, 170, 217, 250, 42, 21, 78, 45, 0, 85, 0, 0];
    Uint8List serviceData = Uint8List.fromList(list);
    ByteData data = ByteData.sublistView(serviceData, 0, 10); //for namespace 10 byte  
    var abc = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);

    var dta = utf8.decode(abc);
    print(dta);
}

我在 utf8.decode(abc) 上遇到以下错误;

Unhandled Exception: FormatException: Unexpected extension byte (at offset 4)

谁能告诉我哪里错了?

【问题讨论】:

  • 为什么要将数据转换成字符串?这显然不是文本数据,所以没有任何意义
  • @SamiKuhmonen,我只想解析它们以获取 Eddystone 命名空间和实例 ID,如此处所述 github.com/google/eddystone/tree/master/eddystone-uid
  • 因此您不应该将任何内容转换为字符串。该链接解释了数据,而不是文本。
  • @SamiKuhmonen 你能解释一下吗?我实际上是飞镖新手。
  • 这和飞镖没什么关系。你有数据和解释它是什么。如果你想要命名空间,它是文档中指示的字节。无需字符串或转换

标签: flutter dart


【解决方案1】:

从 cmets 看来,您似乎要求 十六进制 表示字节序列。

请注意,您希望在 cmets 中用于“命名空间”和“实例”ID 的字符串似乎是错误的。看起来您刚刚转换了 List 的前 16 个字节,但由于您原来的 List 是 20 个字节,它似乎应该是整个 20 字节的服务数据块。

the specification you linked to in your comments 开始,“命名空间”ID 从偏移量 2 开始,长度为 10 个字节。 “实例”ID 从偏移量 12 开始,长度为 6 个字节。因此,您必须首先提取这些子序列。获得所需的子列表后,您可以使用int.toRadixString 将每个字节转换为十六进制字符串,使用String.padLeft 强制使用两个十六进制数字,然后使用List.join 将它们全部组合成一个String

String getHexString(
  List<int> list, {
  required int offset,
  required int length,
}) {
  var sublist = list.getRange(offset, offset + length);
  return [
    for (var byte in sublist)
      byte.toRadixString(16).padLeft(2, '0').toUpperCase()
  ].join();
}

void main() {
  var list = [0, 2, 46, 80, 128, 106, 163, 130, 85, 170, 217, 250, 42, 21, 78, 45, 0, 85, 0, 0];

  var namespaceId = getHexString(list, offset: 2, length: 10);
  var instanceId = getHexString(list, offset: 12, length: 6);

  print(namespaceId); // Prints: 2E50806AA38255AAD9FA
  print(instanceId); // Prints: 2A154E2D0055
}

【讨论】:

  • 谢谢,命名空间和实例 ID 的偏移量、长度应分别为 0,10 和 '10,6'
  • @WatsMyName 我不小心过早地发布了我的答案。请参阅我更新的答案(其中也对代码中的错字进行了重要更正)。
  • 谢谢,为什么你用padLeft(0, '2'),这可能不需要?
  • @WatsMyName 那是错字。我的意思是padLeft(2, '0')
猜你喜欢
  • 1970-01-01
  • 2012-10-21
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多