读取 Java 中的二进制数据

Reading binary data in Java

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

非常感谢任何帮助!


问题更新

这是我的 C# 程序,returns 是我要查找的输出。

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();
      } 
   }
}

在您的 Java 代码中:

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