- 想读取Nas中的相册数据,发现群晖的Nas有App,于是拦截Nas的App请求,发现其中有些数据是通过16进制编码进行加密(编码)的。
- 这样的编码方式可以保证接口拿到的数据肯定是可见字符串。于是就需要进行对这些数据进行解码。
- 找了一下,并没有特别好的编解码工具,于是自己写一个吧。
- 上代码
/// 将字符串转换为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();
}
}
评论区