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

Android位图到字节数组因设备而异

  •  0
  • andras  · 技术社区  · 4 年前

    我正在尝试计算图像的哈希值,这样当用户重命名文件时,应用程序仍然可以识别它。

    所以现在我已经尝试使用哈希值,我想我会计算出图像的SHA-256。当然,在部署之前,我想测试这个应用程序,所以我创建了一个工具测试。

    问题是,它在本地工作,但当我在GithubActions上运行它时(使用 reactivecircus/android-emulator-runner@v2 ),测试失败。我没有太多注意这两个设备之间的差异,它们在API版本(26和31)中是不同的,甚至可能是架构。

    以下是运行方式不同的代码:

        val expected = "bcc060400f0da1b937307daafecc12b5016334cd5023aafa47ff5c31b9a1f2ca"
    
        val bitmap =
            BitmapFactory.decodeResource(
                context.resources,
                R.drawable.unsplash_flowers,
            )
    
        val byteArray =
            bitmap.run {
                val size: Int = this.rowBytes * this.height
                val byteBuffer = ByteBuffer.allocate(size)
                this.copyPixelsToBuffer(byteBuffer)
                return@run byteBuffer.array()
            }
        val sha256 = MessageDigest.getInstance("SHA-256")
        val digest = sha256.digest(byteArray)
        val actual = BigInteger(1, digest).toString(16)
    
        Assert.assertEquals(expected, actual)
    
        bitmap.recycle()
    

    稍后,我还创建了一个测试来计算纯哈希值(以确保哈希算法按预期工作)。

    因此,此代码的运行方式相同(测试在两种情况下都通过):

        val expected = "da9a9fc7b09edde9cc23cec9b7e11a71fb0ab4d2ddd8af8af905306f3e1456fb"
        val sha256 = MessageDigest.getInstance("SHA-256")
        val digest = sha256.digest("sdsdsds".toByteArray(Charsets.UTF_8))
        val actual = BigInteger(1, digest).toString(16)
    
        Assert.assertEquals(expected, actual)
    

    所以这就留给我代码的第一部分 Bitmap 可以不同的转换代码:

        val bitmap =
            BitmapFactory.decodeResource(
                context.resources,
                R.drawable.unsplash_flowers,
            )
    
        val byteArray =
            bitmap.run {
                val size: Int = this.rowBytes * this.height
                val byteBuffer = ByteBuffer.allocate(size)
                this.copyPixelsToBuffer(byteBuffer)
                return@run byteBuffer.array()
            }
    

    可以不同的两个功能是

    • BitmapFactory.decodeResource
    • copyPixelsToBuffer

    这些功能在不同的安卓版本中会有所不同吗?

    事实上,我唯一关心的是,这个哈希在Android版本之间不会改变,在不同的设备上可能会有所不同。

    0 回复  |  直到 4 年前