java 4位byte转为int类型
来源:互联网 发布:黎活明 java 编辑:程序博客网 时间:2024/06/02 21:48
由于要将一段C语言代码翻译成java
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 blocke.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;}}
阅读全文
0 0
- java 4位byte转为int类型
- java中的强制类型转换 int转为byte
- Java类型转换(int - byte[],float - byte[])
- Java类型转换(int - byte[],float - byte[])
- Java类型转换(int - byte[],float - byte[])
- Java类型转换(int - byte[],float - byte[])
- js中将int类型转为float类型,并取位
- java 中 int 与 byte 位运算
- Image类型转为byte[]
- [JAVA]int类型和byte[]互转
- java中类型int转化为Byte
- java-int&short-byte类型转换问题
- java int类型转byte数组
- 32位机,VC中所有类型的指针全部为4byte,int也为4byte,
- 字符串转为int类型
- java环境下char类型转为int类型
- Java之String类型数据转为int类型
- Int类型转换成byte[4]
- Fragment中再嵌套Fragment(java.lang.IllegalStateException: FragmentManager is already executing transact)
- 关于Class.getResource和ClassLoader.getResource的路径问题
- 我oracle数据库安装完了,字符集是ZHS16GBK,但是我需要一个数据库字符集是UTF8的,怎么办?。新建一个数据库实例,选择字符集为utf8即可
- 哪些地方会出现css阻塞,哪些地方会出现js阻塞?
- js中的||与&&用法
- java 4位byte转为int类型
- 破解TLS:这么做真的有利于安全吗?
- Java 中的异常和处理详解
- python中的.idea文件夹是干嘛的
- MySQL性能优化之char、varchar、text的区别
- ChannelBean
- 静静的第一篇
- RelativeLayout常用属性介绍
- 数据结构上机实践第三周项目1