3 回答
TA贡献1883条经验 获得超3个赞
这段代码有多个问题:
Int
每次做测试时,您都在阅读新内容您正在尝试
Int
针对 6 字节值测试 4字节字节顺序在小端处理器上是错误的
下面是一个示例,说明如何构造此代码。
def checkPhotoType(file: File): Option[String] = {
val param = new DataInputStream(new BufferedInputStream(new FileInputStream(file)))
val bytes = (1 to 6).map( _ => param.readByte).toList
bytes match {
case List(0xFF, 0xD8, 0xFF, 0xDB, _, _) =>
Some("jpg/jpeg")
case List(0x47, 0x49, 0x46, 0x38, 0x37, 0x61) =>
Some("GIF87a")
case List(0x47, 0x49, 0x46, 0x38, 0x39, 0x61) =>
Some("GIF89a")
case _ =>
None
}
}
TA贡献1875条经验 获得超5个赞
if (param.readInt() == 0xFFd8FFe0 | param.readInt() == 0xFFd8FFe1 )
Some("jpg/jpeg")
if(param.readInt() == 0x474946383961L)
Some("gif")
你继续int从param. 把它放在一个变量中:
int magic = param.readInt();
if (magic == 0xFFd8FFe0 | magic == 0xFFd8FFe1 )
Some("jpg/jpeg")
if(magic == 0x474946383961L)
Some("gif")
尽管正如DawoodIbnKareem指出的那样,magic == 0x474946383961L永远不会为真,因为常量是 int 范围之外的 long 值。所以,你需要读取更多的数据来匹配这个。
TA贡献1825条经验 获得超6个赞
除了第一个答案之外,您还可以将十六进制字符串转换为整数,如下所示:
String hex = "aa" int value = Integer.parseInt(hex, 16);
或更大的数字
BigInteger bigValue = new BigInteger(hex, 16);
添加回答
举报