如何从文件中读取字节,位运算

假的旁边就是真的 2013-03-18 03:08:30
我是想用java读取一个用C 写的二进制文件,读出来的就是错的,想着先读取一个int然后进行位运算重新组成一个int输出,如此循环。

从文件中读取4个字节,然后进行位运算,我不是很懂这个,自己想着写了一些代码求教:

FileInputStream readFile=new FileInputStream("D:/haier.bin");
DataInputStream dos=new DataInputStream(readFile);

byte[] i=new byte[4];
int readI=0;
while((readI=dos.read(i))!=-1){
byte byte4 = (byte) (readI & 0xff);
byte byte3 = (byte) ((readI & 0xff00) >> 8);
byte byte2 = (byte) ((readI & 0xff0000) >> 16);
byte byte1 = (byte) ((readI & 0xff000000) >> 24);
int real=(byte1& 0xff)<<0 + (byte2& 0xff)<<8 + (byte3& 0xff)<< 16 +(byte4& 0xff)<<24;

System.out.println(Integer.toBinaryString(real));
}
dos.close();
...全文
417 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 12 楼 preferme 的回复:
首先,那个二进制文件不能太大,否则会爆掉内存。 其次,两种方案,可以选择: 方案一:根据文件大小,算出数组的长度,读取数据; 方案二:和楼上的一样,创建一个链表,填充链表,转换成数组即可。
明白
  • 打赏
  • 举报
回复
引用 11 楼 hqshaozhu 的回复:
你最好别使用数组 因为你不知道这个数组到底要存放多少数据 建议使用List集合 byte byte1 = i[0]; byte byte2 = i[1]; byte byte3 = i[2]; byte byte4 = i[3]; List<Integer> list = new ArrayList<Integer>() ; int real……
感谢 很有用
dracularking 2013-03-20
  • 打赏
  • 举报
回复
java怎么就不搞一个无符号左移的运算符呢
冰思雨 2013-03-20
  • 打赏
  • 举报
回复
首先,那个二进制文件不能太大,否则会爆掉内存。 其次,两种方案,可以选择: 方案一:根据文件大小,算出数组的长度,读取数据; 方案二:和楼上的一样,创建一个链表,填充链表,转换成数组即可。
少主无翼 2013-03-19
  • 打赏
  • 举报
回复
你最好别使用数组 因为你不知道这个数组到底要存放多少数据 建议使用List集合 byte byte1 = i[0]; byte byte2 = i[1]; byte byte3 = i[2]; byte byte4 = i[3]; List<Integer> list = new ArrayList<Integer>() ; int real=(byte1& 0xff)<<0 |(byte2& 0xff)<<8 | (byte3& 0xff)<< 16 |(byte4& 0xff)<<24; System.out.println(real); list.add(real) ; } 这样就可以了
  • 打赏
  • 举报
回复
引用 9 楼 hqshaozhu 的回复:
你是已经实现把文件读取进来然后按4字节一个转换成了int类型数据了是吧 然后存入到一个int数组中 然后再继续对这个数组进行读取 对数组进行读取要输入流干嘛 直接读取数组不就好了吗 我就纳闷了 你连C的编码格式都知道 你会不知道这些 你是大智若愚吗
我就一个java新手。 不知道怎么把转换成的int写到一个int数组中,求教
少主无翼 2013-03-19
  • 打赏
  • 举报
回复
你是已经实现把文件读取进来然后按4字节一个转换成了int类型数据了是吧 然后存入到一个int数组中 然后再继续对这个数组进行读取 对数组进行读取要输入流干嘛 直接读取数组不就好了吗 我就纳闷了 你连C的编码格式都知道 你会不知道这些 你是大智若愚吗
  • 打赏
  • 举报
回复
引用 5 楼 hqshaozhu 的回复:
想解码你知道如何编码的吗 不知道的话你难道就像通过简单的位运算就把c的编译文件解码
我知道编码格式啊 只要把对应的字节读出来不就行了
想喝咖啡的貓 2013-03-19
  • 打赏
  • 举报
回复
引用 4 楼 heyufengcc1 的回复:
是的 就是想解码
原来你是这个意思啊,编译成.exe的文件 有一堆压堆、出堆、寄存器指针之类的汇编操作,用java把这个解出来。。。没听过说。。。
  • 打赏
  • 举报
回复
引用 2 楼 preferme 的回复:
没看明白楼主代码的意思。读出整型数据,要做什么样的位运算? FileInputStream fis = new FileInputStream("D:/haier.bin"); byte[] buff = new byte[4]; if(4!=fis.read(buff)){ throw new IllegalStateException("读取文件数据出……
这个位运算我已经解决了 ,我把读取的4个字节重新组成一个新的int输出,现在我想把所有组成的int存在一个字节数组里,以便我随意读取一段字节出来进行解码,你看我该怎么写,是重新创建一个输出流输出再读取吗? 以下是我之前想实现的代码:

try{
	FileInputStream readFile=new FileInputStream("D:/h.bin");
	DataInputStream dos=new DataInputStream(readFile);
	byte[] i=new byte[4];			
	int readI;
	while((readI=dos.read(i))!=-1){
		byte byte1 = i[0];  
		byte byte2 = i[1];  
		byte byte3 = i[2];  
		byte byte4 = i[3];
		int real=(byte1& 0xff)<<0  |(byte2& 0xff)<<8 | (byte3& 0xff)<< 16 |(byte4& 0xff)<<24;				
			System.out.println(real);
	
			}
			dos.close();	
少主无翼 2013-03-19
  • 打赏
  • 举报
回复
想解码你知道如何编码的吗 不知道的话你难道就像通过简单的位运算就把c的编译文件解码
  • 打赏
  • 举报
回复
引用 3 楼 hqshaozhu 的回复:
C写的二进制文件 我的理解是C编译之后的文件 这个文件你读进来也是没用的 就像你把Java编译之后的.class文件读取进来一样 完全无意义 难道你想解码? 转换成源文件
是的 就是想解码
少主无翼 2013-03-19
  • 打赏
  • 举报
回复
C写的二进制文件 我的理解是C编译之后的文件 这个文件你读进来也是没用的 就像你把Java编译之后的.class文件读取进来一样 完全无意义 难道你想解码? 转换成源文件
冰思雨 2013-03-19
  • 打赏
  • 举报
回复
没看明白楼主代码的意思。读出整型数据,要做什么样的位运算? FileInputStream fis = new FileInputStream("D:/haier.bin"); byte[] buff = new byte[4]; if(4!=fis.read(buff)){ throw new IllegalStateException("读取文件数据出错"); } int data = (buff[0]&0xFF)<<24 | (buff[1]&0xFF)<<16 | (buff[2]&0xFF)<<8 | (buff[3]&0xFF); //data就是文件中的整型数据。
达达KZT 2013-03-19
  • 打赏
  • 举报
回复
javase api

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧