尝试了 URLConnection.guessContentTypeFromStream(ByteArrayInputStream(bytes))Tika().detect(bytes)

一个识别不了视频,另一个直接报一堆错

google 很久也没找到可用代码,只好自己动手

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

android kotlin determine file type from bytes 根据文件内容识别文件类型,类似python的filetype的更多相关文章

  1. 转-Android 之 使用File类在SD卡中读取数据文件

    如果需要在程序中使用sdcard进行数据的存储,那么需要在AndroidMainfset.xml文件中 进行权限的配置: Java代码:   <!-- 在sd中创建和删除文件的权限 --> ...

  2. [LeetCode] Find Duplicate File in System 在系统中寻找重复文件

    Given a list of directory info including directory path, and all the files with contents in this dir ...

  3. [android开发IDE]adt-bundle-windows-x86的一个bug:无法解析.rs文件--------rs_core.rsh file not found

    google的android自带的apps写的是相当牛逼的,将其导入到eclipse中方便我们学习扩展.可惜关于导入的资料太少了,尤其是4.1之后的gallery和camera合二为一了.之前导4.0 ...

  4. Android Kotlin Annotation Processer

    Annotation Processer 注解处理器(Annotation Processer)是javac内置的注解处理工具,可以在编译时处理注解,让我们自己做相应的处理.比如生成重复度很高的代码, ...

  5. 安装金山WPS2013造成的HTML5 file.type值异常

    处理代码的兼容性是前端攻城师们的家常便饭了,一般是对各种浏览器进行兼容性处理.但是有时候我们也会遭遇到浏览器以外的影响因素,这个是经常会被忽视掉的内容.比如前几天就听说客户端安装迅雷.暴风影音等软件会 ...

  6. File Type Icons – 免费扁平设计风格文件类型图标集

    这套扁平风格图标集包含一组62个不同的文件类型图标,有 AI,ICO和 PNG 三种格式.他们采用长阴影模式的扁平化设计,看起来非常整齐和现代化.这些图标是完全免费的,可以用于商业项目. 您可能感兴趣 ...

  7. linux command file/type which/whereis

    今天遇到几个命令,初见时感觉好像啊,不太能区分其具体功能和区别,因此特来记录一下. 1. file和type file: 查看文件类型 type: display information of com ...

  8. blocked file type by sharepoint 分类: Sharepoint 2015-07-05 07:45 6人阅读 评论(0) 收藏

    o add or remove blocked file types by using Central Administration Verify that you have the followin ...

  9. php上传常见文件类型对应的$_FILES["file"]["type"](转)

    php上传常见文件类型对应的$_FILES["file"]["type"] from:http://hi.baidu.com/7book/item/374971 ...

随机推荐

  1. Python基础之用tkinter写界面

    参考链接:https://blog.csdn.net/qq_37482202/article/details/84201259 Tkinter介绍 Tkinter(也叫Tk接口)是Tk图形用户界面工具 ...

  2. 使用Elastic Job的时候报“Job conflict with register center”,如何处理?

    昨天,有群友反应根据之前这篇<使用Elastic Job实现定时任务>文章编写测试定时任务的时候,报了类似下面的这个错误: Caused by: org.apache.shardingsp ...

  3. 关于maven打包与jdk版本的一些关系

    最近让不同JAVA版本的容器maven打包折腾的不行,终于理出了一点头绪.在这里记录下备忘. 1. Maven与jdk版本的关系 先明确一个概念,关高版本JDK运行maven,是可以打出低版本的JAV ...

  4. js学习笔记之this指向及形参实参

    var length = 10 function fn () { console.log(this.length) } var obj = { length: 5, method (fn) { fn( ...

  5. 机器学习 - k-means聚类

    k-means简介 k-means是无监督学习下的一种聚类算法,简单说就是不需要数据标签,仅靠特征值就可以将数据分为指定的几类.k-means算法的核心就是通过计算每个数据点与k个质心(或重心)之间的 ...

  6. anyRTC Web SDK 实现音视频呼叫功能

    前言 大家好,今天小编带给大家一个基于 anyRTC Web SDK 实现音视频呼叫的功能(本项目采用vue开发). 前提条件 在开始写代码之前还需要做一些准备工作,如果你之前没有使用过 anyRTC ...

  7. CF474D Flowers 题解

    题目:CF474D Flowers 传送门 DP?递推? 首先可以很快看出这是一道 DP 的题目,但与其说是 DP,还不如说是递推. 大家还记得刚学递推时教练肯定讲过的一道经典例题吗?就是爬楼梯,一个 ...

  8. 浅谈vue响应式原理及发布订阅模式和观察者模式

    一.Vue响应式原理 首先要了解几个概念: 数据响应式:数据模型仅仅是普通的Javascript对象,而我们修改数据时,视图会进行更新,避免了繁琐的DOM操作,提高开发效率. 双向绑定:数据改变,视图 ...

  9. 3.python编程与计算机的关系,如何执行python文件

    上一节预告了这一章想讲如何不停地和世界打招呼,这涉及到编程中一个重要的概念:循环. 但经过了两周断更后细想了一下,不行,我们得对上一章进行补充,而且这个补充非常关键!也印证了上一章所说的: 上一节章很 ...

  10. SpringBoot @ModelAttribute 用法

    前言 项目中遇到这么一个使用场景,用户的登录信息给予token保存,在需要有登录信息的地方,每次都要去获取用户Id,但每次在请求方法中去获取用户信息,代码重复,冗余,很low于是想到了用@ModelA ...