对统一个文件进行读取图片,为什么C语言和JAVA的结果不一样呢。小弟我怎么才能让JAVA读取和C一样的结果呢
对统一个文件进行读取图片,为什么C语言和JAVA的结果不一样呢。我如何才能让JAVA读取和C一样的结果呢?
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
-------------------------------------------------
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和JAVA打印出来的数据就以后很大的不同。
------解决方案--------------------
无符号和有符号数。
------解决方案--------------------
1、数据本质上都是一样的,只是被理解为有符号数和无符号数而已;
2、用byte类型就好,不需要转换的,后续主要把它理解为无符号数即可;
3、如果应是想转换,那么可以这样:
正常情况下,Java提供的数据类型是有符号signed类型的,可以通过位运算的方式得到它们相对应的无符号值:
public int getUnsignedByte (byte data)
{
return data & 0x0FF;
}
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
-------------------------------------------------
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和JAVA打印出来的数据就以后很大的不同。
------解决方案--------------------
无符号和有符号数。
------解决方案--------------------
1、数据本质上都是一样的,只是被理解为有符号数和无符号数而已;
2、用byte类型就好,不需要转换的,后续主要把它理解为无符号数即可;
3、如果应是想转换,那么可以这样:
正常情况下,Java提供的数据类型是有符号signed类型的,可以通过位运算的方式得到它们相对应的无符号值:
public int getUnsignedByte (byte data)
{
return data & 0x0FF;
}