日期:2014-05-18  浏览次数:20688 次

对统一个文件进行读取图片,为什么JAVA和C语言的结果不一样呢。我如何才能让JAVA读取和C一样的结果呢?
对统一个文件进行读取图片,为什么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都是带符号。如果打印结果一样,可以写个有符号