首页 > 解决方案 > 哪种类型的字符集适合图像编码?[科特林]

问题描述

我曾尝试将 btye 数组转换为 charset-8 中的字符串,但它不起作用。有人可以指导我吗?

这是我将位图转换为字节数组的方法

private fun BitmapToByteArray(): ByteArray
    {
        val stream = ByteArrayOutputStream()
        btm1!!.compress(Bitmap.CompressFormat.PNG, 100, stream)
        val bitmapdata: ByteArray = stream.toByteArray()
        return bitmapdata
    } 

这是我加密数据的方式

private fun encrypting_data(bitmapdata: ByteArray): String {
        val key = secretkey!!.text.toString()
        val btm1 = bitmapdata.toString(Charsets.UTF_8)
        val s = btm1
        //generating key from given secret key
        val skey: Key = SecretKeySpec(key.toByteArray(), "AES")
        print(skey.toString())
        val c: Cipher = Cipher.getInstance("AES")
        c.init(Cipher.ENCRYPT_MODE, skey)
        //encrypting text string
        val re = c.doFinal(s.toByteArray())

        //converting encrypted string to base64
        val re_base64 = Base64.encodeToString(re, Base64.NO_WRAP or Base64.NO_PADDING)
        Log.e("aaAA", re_base64.toString())

        //converting each chr of base64 string to binary and combining it
        for (i in re_base64) {
            var single_b_string = Integer.toBinaryString((i.toInt()))
            //if binary str is less than 8 bit then making it 8 bit by adding 0's
            if (single_b_string.length < 8) {
                for (j in 1..(8 - single_b_string.length)) {
                    single_b_string = "0" + single_b_string
                }
            }
            //final binary string to hide in image
            b_string = b_string + single_b_string
        }
        Log.e("barraylength", b_string.toString())
        Log.e("barray", b_string!!.length.toString())
        return b_string.toString()

    }

请指导我,谢谢

标签: arraysandroid-studiokotlin

解决方案


简短的回答:没有。

字符集用于将字符映射到二进制,反之亦然。使用字符编码将图像的字节解码为字符串是没有意义的。您甚至有可能在您选择的字符编码中发现不是有效序列的字节序列,因此它们不会被正确转换为字符。

有时需要使用文本来表示二进制数据(例如,当使用纯文本传输/媒体来存储它时)。在这些情况下,您可以使用其他类型的编码,例如Base64,但我想您知道它,因为您在这里也已经在使用 base64 了。

请注意,在您当前的代码中,您将ByteArray( bitmapdata) 转换为String( btm1/ s) 只是为了将其转换回ByteArray( s.toByteArray())。为什么你甚至需要这样做?


推荐阅读