侧边栏壁纸
博主头像
钱学超博主等级

火星人,1万小时法则的忠实拥趸。技术宅,象棋和羽毛球爱好者,马拉松PB成绩:4小时零8分。坚持认为算法是计算机的灵魂。喜欢解决问题,喜欢手工,喜欢与朋友们聊天喝酒吹牛X。

  • 累计撰写 54 篇文章
  • 累计创建 306 个标签
  • 累计收到 52 条评论
标签搜索

目 录CONTENT

文章目录

dart之字符串Hex编解码

钱学超
2022-02-07 / 0 评论 / 0 点赞 / 391 阅读 / 1,075 字 / 正在检测是否收录...
  1. 想读取Nas中的相册数据,发现群晖的Nas有App,于是拦截Nas的App请求,发现其中有些数据是通过16进制编码进行加密(编码)的。
  2. 这样的编码方式可以保证接口拿到的数据肯定是可见字符串。于是就需要进行对这些数据进行解码。
  3. 找了一下,并没有特别好的编解码工具,于是自己写一个吧。
  4. 上代码
/// 将字符串转换为16进制编码,或者将16进制编码的字符串解码为普通字符串。utf8.
class Hex {
  // UTF8 解码器
  static const Utf8Decoder _decoder = Utf8Decoder();

  // UTF8 编码器
  static const Utf8Encoder _encoder = Utf8Encoder();

  /// 编码,使用16进制编码指定字符串
  static String encode(String origin) {
    var tmp = _encoder.convert(origin);
    return _encodeList2String(tmp);
  }

  /// 解码,将编码过的字符串还原成编码前的样子。
  static String decode(String origin) {
    try {
      var temp = _decodeStr2List(origin);
      return _decoder.convert(temp);
    } on Exception catch (_, e) {
      return "";
    }
  }

  /// Creates a `Uint8List` by a hex string.
  static Uint8List _decodeStr2List(String hex) {
    var result = Uint8List(hex.length ~/ 2);
    for (var i = 0; i < hex.length; i += 2) {
      var num = hex.substring(i, i + 2);
      var byte = int.parse(num, radix: 16);
      result[i ~/ 2] = byte;
    }
    return result;
  }

  /// Returns a hex string by a `Uint8List`.
  static String _encodeList2String(Uint8List bytes) {
    var result = StringBuffer();
    for (var i = 0; i < bytes.lengthInBytes; i++) {
      var part = bytes[i];
      result.write('${part < 16 ? '0' : ''}${part.toRadixString(16)}');
    }
    return result.toString();
  }

}

0

评论区