Android中Hex转Binary再转Base64遇问题:Hex校验返回false
十六进制校验与转换问题
我需要处理十六进制(Hex)码,示例Hex码如下:
20 12 B3 5C A9 6D 11
目标Hex值存储在变量中:
val hexValues = "6B38208A4D0D6D11756F9B21B3395BD4FE427BEE76FE4760B09FCC5E2D76CC"
问题1:十六进制校验函数返回false
编写的两个校验函数均返回false:
第一个校验函数
private fun isHexDec(cadena: String): Boolean { if (cadena.isEmpty() || cadena[0] != '-' && (cadena[0].digitToIntOrNull(16) ?: -1) == -1) return false if (cadena.length == 1 && cadena[0] == '-') return false for (i in 1 until cadena.length) if (cadena[i].digitToIntOrNull(16) ?: -1 == -1) return false return true }
第二个校验函数
private fun isHexadecimal(s: String): Boolean { return s.chars().allMatch { c: Int -> "0123456789ABCDEFabcdef".indexOf(c.toChar()) >= 0 } }
问题2:十六进制转二进制及Base64转换需求
当前使用以下代码将Hex转二进制,还需将二进制数据转换为Base64字符串:
private fun hexToBin(s: String?): String? { return BigInteger(s, 16).toString(2) }
解决方案
1. 修复十六进制校验逻辑
两个校验函数返回false的核心原因是:目标Hex字符串包含空格(20是空格的十六进制编码),但校验逻辑只允许纯十六进制字符(0-9、A-F/a-f),未处理空格场景。
如果Hex字符串允许包含空格,需先清理空格再校验:
private fun isHexadecimal(s: String): Boolean { val cleanedHex = s.replace(" ", "") return cleanedHex.isNotEmpty() && cleanedHex.chars().allMatch { c -> "0123456789ABCDEFabcdef".indexOf(c.toChar()) != -1 } }
2. 完整Hex转Base64流程
无需先转换为二进制字符串,直接将Hex转字节数组再转Base64更高效:
import java.math.BigInteger import java.util.Base64 private fun hexToBase64(hexStr: String): String { // 清理Hex字符串中的空格 val cleanedHex = hexStr.replace(" ", "") // Hex转字节数组 val bytes = BigInteger(cleanedHex, 16).toByteArray() // 字节数组转Base64 return Base64.getEncoder().encodeToString(bytes) }
若必须先转二进制字符串再转Base64,需补前导零保证字节长度对齐:
import java.util.Base64 private fun hexToBinToBase64(hexStr: String): String { val cleanedHex = hexStr.replace(" ", "") val binaryStr = BigInteger(cleanedHex, 16).toString(2) // 补前导零,确保二进制字符串长度为8的倍数 val paddedBinary = binaryStr.padStart((binaryStr.length + 7) / 8 * 8, '0') // 二进制字符串转字节数组 val bytes = paddedBinary.chunked(8) .map { it.toByte(2) } .toByteArray() // 转Base64 return Base64.getEncoder().encodeToString(bytes) }
内容的提问来源于stack exchange,提问作者mobi_dev
相关产品推荐
相关产品推荐

