JAVA Code:
-
public class HexUtils { -
/** * 十六进制String转换成Byte[] * @param hexString the hex string * @return byte[] */ -
public static byte[] hexStringToBytes(String hexString) { -
if (hexString == null || hexString.equals("")) { -
return null; -
} -
hexString = hexString.toUpperCase(); -
int length = hexString.length() / 2; -
char[] hexChars = hexString.toCharArray(); -
byte[] d = new byte[length]; -
for (int i = 0; i < length; i++) { -
int pos = i * 2; -
d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1])); -
} -
return d; -
} -
/** * Convert char to byte * @param c char * @return byte */ -
private static byte charToByte(char c) { -
return (byte) "0123456789ABCDEF".indexOf(c); -
} -
/* 这里我们可以将byte转换成int,然后利用Integer.toHexString(int)来转换成16进制字符串。 * @param src byte[] data * @return hex string */ -
public static String bytesToHexString(byte[] src){ -
StringBuilder stringBuilder = new StringBuilder(""); -
if (src == null || src.length <= 0) { -
return null; -
} -
for (int i = 0; i < src.length; i++) { -
int v = src[i] & 0xFF; -
String hv = Integer.toHexString(v); -
if (hv.length() < 2) { -
stringBuilder.append(0); -
} -
stringBuilder.append(hv); -
} -
return stringBuilder.toString(); -
}
这段代码在Java上使用或者kotlin引用都不会出现问题的,但现在Google宣布Kotlin成安卓官方语言,所以很多人都会将之前Java代码转成kotlin,如果是把Java代码直接通 studiog工具栏Code->Convert java File to Kotlin 生成kotlin代码,则会报以下的错误
这两个地方的出错都是由于kotlin位运算符只适用于Int 和 Long,所以先将shl ,and 前面的值转成Int 类型再执行shl ,and 等运算。Kotlin中每个数字类型支持如下的转换:
toByte(): BytetoShort(): ShorttoInt(): InttoLong(): LongtoFloat(): FloattoDouble(): DoubletoChar(): Char
Kotlin Code
-
object HexUtils { -
/** -
* 十六进制String转换成Byte[] -
* @param hexString the hex string -
* * -
* @return byte[] -
*/ -
fun hexStringToBytes(hexString: String?): ByteArray? { -
var hexString = hexString -
if (hexString == null || hexString == "") { -
return null -
} -
hexString = hexString.toUpperCase() -
val length = hexString.length / 2 -
val hexChars = hexString.toCharArray() -
val d = ByteArray(length) -
for (i in 0..length - 1) { -
val pos = i * 2 -
d[i] = (charToByte(hexChars[pos]).toInt() shl 4 or charToByte(hexChars[pos + 1]).toInt()).toByte() -
} -
return d -
} -
/** -
* Convert char to byte -
* @param c char -
* * -
* @return byte -
*/ -
private fun charToByte(c: Char): Byte { -
return "0123456789ABCDEF".indexOf(c).toByte() -
} -
/* 这里我们可以将byte转换成int,然后利用Integer.toHexString(int)来转换成16进制字符串。 -
* @param src byte[] data -
* @return hex string -
*/ -
fun bytesToHexString(src: ByteArray?): String? { -
val stringBuilder = StringBuilder("") -
if (src == null || src.size <= 0) { -
return null -
} -
for (i in 0..src.size-1) { -
val v = src[i].toInt() and 0xFF -
val hv = Integer.toHexString(v) -
if (hv.length < 2) { -
stringBuilder.append(0) -
} -
stringBuilder.append(hv) -
} -
return stringBuilder.toString() -
} -
}
因为是工具类,一般都应该是单例,在kotlin中 Object +类名 即表示该