读取 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# 代码相对应的方法。
因此,对于我正在处理的项目,我需要将二进制数据从 .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# 代码相对应的方法。