kar*_*ick 5 java image bytearray
我有一个要求,我需要识别图像的类型,而不是通过文件扩展名,但通过验证标头.我试图通过幻数验证来验证JPEG文件.
File imgFile =
new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Chrysanthemum.jpg");
byte[] ba = Files.toByteArray(imgFile); //Its a google guava library
int i = 0;
if(ba [i] == 0xFF && ba[i+1] == 0xD8 && ba[i+2] == 0xFF && ba[i+3] == 0xE0){
System.out.println("isJPEG");
}
Run Code Online (Sandbox Code Playgroud)
但条件并没有让人满意.ba[i]
回报-1
.
我究竟做错了什么?
在Java中,byte
原语是有符号的,范围是-128到127,这意味着你的ba[0]
结果是-1
,而0xFF
被解释为 int as 255
。0xFF
如果您使用运算符执行按位 AND 操作,&
则会将有符号字节转换为正确的值,并且您的代码将正常工作,如下所示:
File imgFile =
new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Chrysanthemum.jpg");
byte[] ba = Files.toByteArray(imgFile); //Its a google guava library
int i = 0;
if((ba [i] & 0xFF) == 0xFF && (ba[i+1] & 0xFF) == 0xD8 && (ba[i+2] & 0xFF) == 0xFF
&& (ba[i+3] & 0xFF) == 0xE0) {
System.out.println("isJPEG");
}
Run Code Online (Sandbox Code Playgroud)
不过,我不确定您使用的确切逻辑,因为维基百科指出 JPEG 的幻数如下:
JPEG 图像文件以 FF D8 开头并以 FF D9 结尾
FF E0
是 JFIF 特定的,因此您可能需要仔细检查为什么要检查此内容
以下是用于根据维基百科进行检查的代码:
File imgFile =
new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Chrysanthemum.jpg");
byte[] ba = Files.toByteArray(imgFile); //Its a google guava library
int i = 0;
if((ba [i] & 0xFF) == 0xFF && (ba[i+1] & 0xFF) == 0xD8 && (ba[ba.length - 2] & 0xFF) == 0xFF
&& (ba[ba.length - 1] & 0xFF) == 0xD9) {
System.out.println("isJPEG");
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2413 次 |
最近记录: |