用Java读取二进制数据

时间:2015-01-22 21:38:19

标签: java binary binary-data

因此,对于我正在进行的项目,我需要将.FRX文件中的二进制数据读入我的Java项目。然而,Java的标准字节读取器不断为我返回错误的字节,我相信这可能是Java修改过的UTF8编码的结果。如果我使用C#的二进制读取方法,我会得到我需要的输出。一个显而易见(但证明是困难的)解决方案是使用C#和DLL包装到Java项目中,我只是想知道是否有人在Java中有任何更简单的替代方案,也许是可以用Java实现的替代标准字节读取器相对容易。

非常感谢任何帮助!


问题更新

这是我的C#程序,它返回我正在寻找的输出。

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

    public class GetFromFRX
    {
        public string getFromFRX(string filename, int pos)
        {
            StringBuilder buffer = new StringBuilder();
            using (BinaryReader b = new BinaryReader(File.Open("frmResidency.frx", FileMode.Open)))
            {
                try
                {
                    b.BaseStream.Seek(pos, SeekOrigin.Begin);
                    int length = b.ReadInt32();

                    for (int i = 0; i < length; i++)
                    {
                        buffer.Append(b.ReadChar());
                    }
                }
                catch (Exception e)
                {
                    return "Error obtaining resource\n" + e.Message;
                }

            }
            return buffer.ToString();
        }
    }

这里有一些格式不同的Java代码:

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;

public class JavaReader {

   public static void main(String[] args) throws Exception {

      InputStream i = null;
      BufferedInputStream b = null;

      try{
         // open file
         i = new FileInputStream("frmResidency.frx");

         // input stream => buffed input stream 
         b = new BufferedInputStream(i);

         int numByte = b.available();
         byte[] buf = new byte[numByte];

         b.read(buf, 2, 3);

         for (byte d : buf) {
            System.out.println((char)d+":" + d);
         }
         }catch(Exception e){
            e.printStackTrace();
         }finally{
            if(i!=null)
               i.close();
            if(b!=null)
               b.close();
      } 
   }
}

1 个答案:

答案 0 :(得分:1)

在您的Java代码中:

  • 您正在以{Javadoc中特别警告的方式使用available()
  • 您没有检查read()方法返回的结果。
  • 您正在读取偏移量为2的缓冲区,然后检查整个缓冲区。
  • 您正在读取C#代码读取字符的字节。
  • 你不是在读长度词。
  • 您没有使用与您的C#代码相对应的DataInputStream.readInt()等方法。