十六进制
- 十六进制转十进制
String hexStr = "5208";//16进制一定要去除前缀"0x"
int.parse(hexStr, radix: 16);
- 十六进制转BigInt
String hexStr = "5208";//16进制一定要去除前缀"0x"
BigInt.parse(hexStr, radix: 16);
- 十六进制转字符串
static String hexToString(String hex0x) {
String hex = HexUtils.remove0X(hex0x);
String result = "";
for (var i = 0; i < hex.length; i += 2) {
String codeStr = hex.substring(i, i + 2);
int codeInt = int.parse(codeStr, radix: 16);
result += String.fromCharCode(codeInt);
}
return result;
}
有时,从16进制转换为字符串后,因为16进制数据源的原因,前后可能会有空格以及一些奇怪的字符
此时需要去掉,可以通过以下这个方法(参考源:JDK中String的trim方法实现)
static String trim(String content) {
int len = content.length;
int st = 0;
while ((st < len) && (content.codeUnitAt(st) <= ' '.codeUnits[0])) {
st++;
}
while ((st < len) && (content.codeUnitAt(len - 1) <= ' '.codeUnits[0])) {
len--;
}
return ((st > 0) || (len < content.length)) ? content.substring(st, len) : content;
}
十进制
- 十进制转十六进制
int i = 5;
i.toRadixString(16);
乘方/次方/次幂
//10的2次方
pow(10, 2)
UInt8List转十六进制,具体细则看注释
static String uint8ToHex(Uint8List byteArr) {
if (byteArr == null || byteArr.length == 0) {
return "";
}
Uint8List result = Uint8List(byteArr.length << 1);//创建一个byteArr.length两倍大的数组以存储16进制字符
var hexTable = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F']; //16进制字符表
//下面的for循环是通过codeUnitAt()方法取byteArr每一位对应的字符串的“UTF-16代码单元”,如果去掉.codeUnitAt()其实也就直接是16进制字符串
for (var i = 0; i < byteArr.length; i++) {
var bit = byteArr[i]; //取传入的byteArr的每一位
var index = bit >> 4 & 15; //右移4位,取剩下四位,&15相当于&F,也就是&1111
var i2 = i << 1; //byteArr的每一位对应结果的两位,所以对于结果的操作位数要乘2
result[i2] = hexTable[index].codeUnitAt(0); //左边的值取字符表,转为Unicode放进resut数组
index = bit & 15; //取右边四位,相当于01011010&00001111=1010
result[i2 + 1] = hexTable[index].codeUnitAt(0); //右边的值取字符表,转为Unicode放进resut数组
}
//这里为了优化转换成一整个String的效率,所以就在上面的循环中先转成codeUnit再通过String的实例方法来生成字符串,否则需要用result.join(""),这个join()方法的效率低于String.fromCharCodes()方法
return String.fromCharCodes(result); //Unicode转回为对应字符,生成字符串返回
}
网友评论