我是想用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();javabyte位运算

解决方案 »

  1.   

    没看明白楼主代码的意思。读出整型数据,要做什么样的位运算?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就是文件中的整型数据。
      

  2.   

    C写的二进制文件  我的理解是C编译之后的文件  这个文件你读进来也是没用的  就像你把Java编译之后的.class文件读取进来一样  完全无意义   难道你想解码?   转换成源文件
      

  3.   

    这个位运算我已经解决了 ,我把读取的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();
      

  4.   

    原来你是这个意思啊,编译成.exe的文件 有一堆压堆、出堆、寄存器指针之类的汇编操作,用java把这个解出来没听过说
      

  5.   

    你是已经实现把文件读取进来然后按4字节一个转换成了int类型数据了是吧  然后存入到一个int数组中  然后再继续对这个数组进行读取   对数组进行读取要输入流干嘛   直接读取数组不就好了吗   
    我就纳闷了   你连C的编码格式都知道  你会不知道这些
    你是大智若愚吗
      

  6.   


    我就一个java新手。
    不知道怎么把转换成的int写到一个int数组中,求教
      

  7.   

    你最好别使用数组  因为你不知道这个数组到底要存放多少数据   建议使用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) ;
    }
    这样就可以了
      

  8.   

    java怎么就不搞一个无符号左移的运算符呢