You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 18:50:27