对统一个文件进行读取图片,为什么C语言和JAVA的结果不一样呢。我如何才能让JAVA读取和C一样的结果呢?
JAVA语言:
public byte[] image2Bytes(String imagePath) throws Exception {
BufferedImage bu=ImageIO.read(new File(imagePath));
ByteArrayOutputStream imageStream = new ByteArrayOutputStream();
try {
ImageIO.write(bu, "bmp", imageStream);
} catch (Exception e) {
e.printStackTrace();
}
imageStream.flush();
return imageStream.toByteArray();
}
--------------------
byte[] imgBuff = hello.image2Bytes("a.bmp");
int nImageSize = imgBuff.length;
for(int i=0;i<10;i++){
if(imgBuff[i]!=-1){
System.out.println(i+":"+imgBuff[i]);
}
}
读取字符,假设前十个
0:66
1:77
2:-54
3:61
4:7
5:0
6:0
7:0
8:0
9:0
-----------------------------------
C语言:
FILE *fpImageFile;
long lBegin, lEnd;
unsigned char *pImage;
int nImageSize;
fpImageFile = fopen("a.bmp", "rb");//读取图片
lBegin = ftell(fpImageFile);
fseek(fpImageFile, 0L, SEEK_END);
lEnd = ftell(fpImageFile);
nImageSize = int(lEnd - lBegin);
pImage = new unsigned char[nImageSize];
fseek(fpImageFile, 0L, SEEK_SET);
fread(pImage, sizeof(unsigned char), nImageSize, fpImageFile);
fclose(fpImageFile);
int k=0;
for(k=0;k<10;k++){
printf("%d : %d\n",k,pImage[k]);
}
打印字符,假设前10个
0 : 66
1 : 77
2 : 202
3 : 61
4 : 7
5 : 0
6 : 0
7 : 0
8 : 0
9 : 0
-------------------------------------------------
为什么第二个元素的内容不一样呢?
真实的情况下,不仅仅读取是个元素,图片有多大就图去多大,这样。C和JAVA打印出来的数据就以后很大的不同。
------解决方案--------------------
楼主,你仔细想想-54和202的区别就知道了,202是-54的补码形式,java的byte是带符号的,而c中byte是不带符号的,这就是为什么小于128的正数,他们的结果都一样,而大于等于128的就不一样了。
------解决方案--------------------
原因可能就是有符号和无符号引起的
------解决方案--------------------
java都是带符号。如果打印结果一样,可以写个有符号数转无符号的function,不过个人觉得,没啥子意义