java 4位byte转为int类型
2017-09-20 10:52
661 查看
由于要将一段C语言代码翻译成java
而最关键的文件操作,一次从文件里面读取四个字节的数据存放到data[i][j].x和data[i][j].y中
由于java只能读取到byte中,写了一个 byte2int的转换h函数
然后我发现只有一部分数据正确,而且只要data中存在负数就不正确了,之后在调试之后发现
res = res | data[0] 这一步的时候,实际上是执行的 res = res | (int)data[0] 操作,当data[0]位负数的时候,高位全部补1,导致的结果错误
然后进行改进
public static int byte2int(byte[] data, int n) {
switch (n) {
case 1:
return (int) data[0];
case 2:
return (int) (data[0] & 0xff) | (data[1] << 8 & 0xff00);
case 3:
return (int) (data[0] & 0xff) | (data[1] << 8 & 0xff00) | (data[2] << 16 & 0xff0000);
case 4:
return (int) (data[0] & 0xff) | (data[1] << 8 & 0xff00) | (data[2] << 16 & 0xff0000)
| (data[3] << 24 & 0xff000000);
default:
return 0;
}
}
void ReadFile(Point data[][MAX_LENGTH],CString path,int n) { CString str=""; Initialize(data); FILE * fp; CString filename; int i,j; str.Format("%d",n-1); filename=path; filename+="/"; for (i=0;i<3-str.GetLength();i++) filename+="0"; filename+=str; filename+=".dat"; if ((fp=fopen(filename,"rb"))==NULL) { //printf("Can not create the file.\n"); return; } int t=-1; i=0; j=0; while (!feof(fp)) { fread(&t, sizeof(int), 1, fp); if (t != -1) { data[i][j].x=t; fread(&t, sizeof(int), 1, fp); data[i][j].y=t; j++; } else { fread(&t, sizeof(int), 1, fp); i++; j=0; } if ((i>=MAX_STROKE)||(j>=MAX_LENGTH)) break; } fclose(fp); }
而最关键的文件操作,一次从文件里面读取四个字节的数据存放到data[i][j].x和data[i][j].y中
由于java只能读取到byte中,写了一个 byte2int的转换h函数
public void ReadFile(Point[][] data, String path, int n) { Initialize(data); int i, j; String str = String.valueOf(n - 1); StringBuilder filename = new StringBuilder(); filename.append(path).append("/"); for (i = 0; i < 3 - str.length(); i++) filename.append("0"); filename.append(str).append(".dat"); File file = new File(filename.toString()); FileInputStream fis; try { fis = new FileInputStream(file); i = 0; j = 0; byte[] t = new byte[4]; int tint, len; while ((len = fis.read(t)) <= 0) { tint = byte2int(t, len); if (tint != -1) { data[i][j].x = tint; len = fis.read(t); data[i][j].y = byte2int(t, len); j++; } else { fis.read(t); i++; j = 0; } if (i >= Constants.MAX_STROKE || j >= Constants.MAX_LENGTH) break; } fis.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } }最开始的byte2int转换函数的写法
public static int byte2int(byte[] data,int len) { int res = 0; switch(len) { case 1:{ res = res |data[0]; return res; } case 2:{ res = res |data[1]; res = res << 8; res = res |data[0]; return res; } case 3:{ res = res |data[2]; res = res << 8; res = res |data[1]; res = res << 8; res = res |data[0]; return res; } case 4:{ res = res | data[3]; res = res << 8; res = res | data[2]; res = res << 8; res = res | data[1]; res = res << 8; res = res | data[0]; return res; } default:return res; } }
然后我发现只有一部分数据正确,而且只要data中存在负数就不正确了,之后在调试之后发现
res = res | data[0] 这一步的时候,实际上是执行的 res = res | (int)data[0] 操作,当data[0]位负数的时候,高位全部补1,导致的结果错误
然后进行改进
public static int byte2int(byte[] data, int n) {
switch (n) {
case 1:
return (int) data[0];
case 2:
return (int) (data[0] & 0xff) | (data[1] << 8 & 0xff00);
case 3:
return (int) (data[0] & 0xff) | (data[1] << 8 & 0xff00) | (data[2] << 16 & 0xff0000);
case 4:
return (int) (data[0] & 0xff) | (data[1] << 8 & 0xff00) | (data[2] << 16 & 0xff0000)
| (data[3] << 24 & 0xff000000);
default:
return 0;
}
}
相关文章推荐
- C的无符号数据类型int,short,byte 转为 Java对应的数据long,char,short
- C的无符号数据类型int,short,byte 转为 Java对应的数据long,char,short
- C的无符号数据类型int,short,byte 转为 Java对应的数据long,char,short
- java中,byte转为int为何要&0xff
- JAVA中有关byte,int,long这些基本数据类型的存储方式以及负数在JAVA中的表示方式
- java中byte数组与int类型的转换(两种方式)
- java中byte数组与int类型的转换(两种方式)
- java int与byte类型转换的2种方法
- Java中byte类型转型为int类型为什么要作&0xff
- java中byte数组与int类型的转换(两种方式)
- Java 字节数组类型(byte[])与int类型互转
- 08.java语言基础-整数类型(byte-short-int-long)
- java中的int类型和byte数组的相互转换
- Java byte类型转换成int类型时需要 & 0XFF的原因
- java-int&short-byte类型转换问题
- java Byte和各数据类型(short,int,long,float,double)之间的转换
- java int 类型与 byte 类型之间的转换
- java中byte数组与int类型的转换(两种方式)
- Java基础-数据类型int,short,char,long,float,double,boolean,byte
- 有关java中数据类型byte,int的一个小问题