代码之家  ›  专栏  ›  技术社区  ›  Raphael

将字节数组转换为十六进制字符串

  •  4
  • Raphael  · 技术社区  · 6 年前

    fun ByteArray.toHexString() : String {
        return this.joinToString("") { it.toString(16) }
    }
    

    结果是 Byte 签署 ,所以每个字节都有负的十六进制表示,这会导致一个完全虚假的最终结果。

    也, Byte.toString

    最简单的(没有附加库,理想情况下没有扩展)resp是什么。最有效的解决方案?

    3 回复  |  直到 6 年前
        1
  •  59
  •   Roland    6 年前

    由于我在Kotlin 1.3上,您可能还对 UByte Kotlin 1.3M1 1.3M2 announcement )

    例如。:

    @ExperimentalUnsignedTypes // just to make it clear that the experimental unsigned types are used
    fun ByteArray.toHexString() = asUByteArray().joinToString("") { it.toString(16).padStart(2, '0') }
    

    格式化选项可能是其他最好的变体(但可能不是那么容易阅读。。。而且我总是忘记它是怎么工作的,所以它肯定不那么容易记住(对我来说:-):

    fun ByteArray.toHexString() = joinToString("") { "%02x".format(it) }
    
        2
  •  9
  •   Raphael    6 年前

    printf 我们想要的是:

    fun ByteArray.toHexString() : String {
        return this.joinToString("") {
            java.lang.String.format("%02x", it)
        }
    }
    
        3
  •  1
  •   Salem    6 年前
    fun ByteArray.toHexString() = joinToString("") {
        Integer.toUnsignedString(java.lang.Byte.toUnsignedInt(it), 16).padStart(2, '0')
    }
    

    幸运的是,Java已经 toUnsignedString Integer Long . 不幸的是,这些方法 ,因此需要首先转换每个字节(使用 Byte#toUnsignedInt ).

        4
  •  1
  •   JPM    4 年前

    @JvmOverloads
    fun ByteArray.toHexString(separator: CharSequence = " ",  prefix: CharSequence = "[",  postfix: CharSequence = "]") =
        this.joinToString(separator, prefix, postfix) {
            String.format("0x%02X", it)
        }
    

    输出:

    [0x10 0x22]