【问题标题】:In Java or Groovy, how to find file type of byte[]? [duplicate]在 Java 或 Groovy 中,如何查找 byte[] 的文件类型? [复制]
【发布时间】:2013-08-03 01:14:23
【问题描述】:

我有一个byte[],我通过网络得到了它并想验证它是一个JPEG。如何做到这一点?

基本上,不必写出文件,我或多或少想做file 命令的作用:

$ file aoeu.jpeg
aoeu.jpeg: JPEG image data, JFIF standard 1.02

【问题讨论】:

  • 我曾经在 CMS 中找到了 file 命令的 Java 实现...但是如果我知道是哪一个以及在哪里...
  • 你不能没有广泛的查找。查看文件的源代码。这是一个庞大的数据库。

标签: java


【解决方案1】:

JPEG 图像以 FF D8 开头,因此您可以检查前 2 个字节是否为 FF D8

示例代码:

    InputStream stream = new FileInputStream(file);

    byte[] bytes = new byte[2];

    stream.read(bytes);

    if (bytes[0] != (byte)0xFF || bytes[1] != (byte)0xD8) {
        //no jpeg
    }

    stream.close()

当然,您无法确定 JPEG 是否有效且加载正确。

【讨论】:

  • bytes[0] != 0xFF 将永远是true,因为0xFF 是一个代表int 的字面量255,而bytes[0] 中的最大值是127。你有正确的想法,但代码是错误的。
  • 哦,给我一点时间,已经很晚了:P
  • @jlordo 现在应该可以工作了,另一种方法是将 bytes[0] 和 bytes[1] 转换为无符号字节,但我认为这样更好
【解决方案2】:

如果发现这个有趣的评论:

同样,JPEG 常用的幻数(Joint Photographic 专家组)图像文件为 0x4A464946,即 ASCII 相当于 JFIF(JPEG 文件交换格式)。然而,JPEG 魔术 数字不是文件中的第一个字节;相反,它们从 第七个字节。

在这里找到它http://www.linfo.org/magic_number.html

所以你可以寻找:

Hex: FF D8 xx xx xx xx 4A 46 49 46 00
ASCII: ÿØÿè..JFIF.

【讨论】:

    【解决方案3】:

    您可以读取流的第一个和最后一个字节,并检查“幻数”

    基本上,幻数是标识文件内容的字节头

    JPEG image files begin with FF D8 and end with FF D9.
    

    更多信息here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-14
      • 2018-05-08
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 2011-09-23
      • 2013-12-25
      相关资源
      最近更新 更多