【问题标题】:Please tell me what am i doing wrong in the following java code请告诉我在下面的java代码中我做错了什么
【发布时间】:2012-06-22 08:52:13
【问题描述】:

我正在读取一个二进制文件,其中数字数据以 16 位形式存储。当这个文件被读取visual c++程序时,它工作正常,但是当我使用下面的java代码时,我无法得到想要的结果,并且输出似乎是垃圾值。如您所见,我正在使用RandomAccessFile。但我得到了绝对荒谬的价值观。还有一件事,我在这个文件中存储了浮点值,但即使我使用readFloat()readInt()readShort(),我也无法得到想要的结果。请指出我哪里出错了。 文件中的前 10 个字节:01100000 00000000 00100011 00100000 11000000 00100011 11000001 00100010 10111111 00100001 .感谢大家抽出宝贵时间

public class Test {
    public static void main(String[] args) throws IOException {
        RandomAccessFile data = new RandomAccessFile("D:\\RawEEGData.bin","r");
        try {
            while(data != null) {

                // i have tried readFloat(), readShort() and readInt()
                // but none of them seems to be working
                float myInt16 = data.readFloat(); 

                System.out.printf(" %f\n", myInt16);
            }
        } finally {
            if (data != null) { data.close(); };
        }
     }
 }

【问题讨论】:

  • 您确定您的数据存储在 BigInt IEEE754 中并从文件开头开始吗?有什么错误?
  • 你需要更清楚这个“16位形式的数字数据”是什么。
  • 您确定 Java 和 C++ 在当前上下文中使用相同的字节序吗?
  • 其实写对应c++代码的那个人告诉我,这是16位形式的数值数据,即数据文件的16位对应一个数据点。他使用 ReadInt16() 提取代码中的数据,并且运行良好。所以我想它一定是 int 类型。
  • 请不要关闭此帖子。我迫切需要解决这个问题。

标签: java visual-c++ file-io binaryfiles


【解决方案1】:

这看起来像一个字节顺序问题。如果您的同事使用 ReadInt16,那么这些数字就不是浮点数。试试这个:

  byte b0 = data.readByte();
  byte b1 = data.readByte();
  int i = (((int)b1)<<8) + b0;
  System.out.print(" int value : " + i);

编辑:如果这不起作用,请编辑您的问题以将前 8 个字节显示为 10101000 01... 或 hexa

【讨论】:

    【解决方案2】:

    你需要弄清楚 int16 数据到底是什么:

    • 字节顺序(字节序)?
    • 签名还是未签名?
    • 二进制补码还是其他?

    除非您知道数据的形式,否则您将无法正确解释它。根据结果​​,RandomAccessFile 上提供的方法可能没用,因为它们只涵盖了 java 中常用的格式。

    最有可能的问题是 VC++ 以平台相关顺序存储数据,而 Java 总是使用大端字节顺序(也称为网络字节顺序)。

    【讨论】:

      猜你喜欢
      • 2022-06-15
      • 2020-07-23
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多