1. 程式人生 > 實用技巧 >android kotlin determine file type from bytes 根據檔案內容識別檔案型別,類似python的filetype

android kotlin determine file type from bytes 根據檔案內容識別檔案型別,類似python的filetype

fun byteArrayOfInts(vararg ints: Int) = ByteArray(ints.size) { pos -> ints[pos].toByte() }

val sig2mime = HashMap<ByteArray, Pair<String, Int> > ().apply {
    this[byteArrayOfInts(0xff, 0xd8)] = Pair("image/jpeg", 0) // mime, offset
    this[byteArrayOfInts(0x42, 0x4d)] = Pair("image/bmp", 0)
    this[byteArrayOfInts(0x47, 0x49, 0x46, 0x38)] = Pair("image/gif", 0)
    this[byteArrayOfInts(0x89, 0x50, 0x4E, 0x47)] = Pair("image/png", 0)
    this[byteArrayOfInts(0x66, 0x74, 0x79, 0x70)] = Pair("video/mp4", 4)
    this[byteArrayOfInts(0x52, 0x49, 0x46, 0x46)] = Pair("video/avi", 0)
}

fun guess(bytes: ByteArray):String{
    for ((k,v) in sig2mime){
        var cs = bytes.copyOfRange(v.second, bytes.size).contentToString()
        cs = cs.substring(1, cs.length-1)

        var kcs = k.contentToString()
        kcs = kcs.substring(1, kcs.length-1)

        if (cs.startsWith(kcs))
            return v.first
    }

    return ""
}

參考連結:
https://stackoverflow.com/a/29033128/1936057
https://www.garykessler.net/library/file_sigs.html
https://www.freeformatter.com/mime-types-list.html
https://filesignatures.net/index.php?page=all