【问题标题】:C# - Read a double valueC# - 读取双精度值
【发布时间】:2011-06-21 03:38:18
【问题描述】:
  1. 假设只有一个双精度值以二进制格式写入文件。如何使用 C# 或 Java 读取该值?

  2. 如果我必须从一个巨大的二进制文件中找到一个双精度值,我应该使用什么技术来找到它?

【问题讨论】:

    标签: c# .net c#-4.0 bitconverter


    【解决方案1】:

    Double 是 8 个字节。要从二进制文件中读取单个双精度,您可以使用 BitConverter 类:

    var fileContent = File.ReadAllBytes("C:\\1.bin");
    double value = BitConverter.ToDouble(fileContent, 0);
    

    如果需要从文件中间读取double,请将0替换为字节偏移量。

    如果不知道偏移量,就无法判断字节数组中的某个值是双精度、整数还是字符串。

    另一种方法是:

    using (var fileStream = File.OpenRead("C:\\1.bin"))
    using (var binaryReader = new BinaryReader(fileStream))
    {
        // fileStream.Seek(0, SeekOrigin.Begin); // uncomment this line and set offset if the double is in the middle of the file
        var value = binaryReader.ReadDouble();
    }
    

    第二种方法更适合大文件,因为它不会将整个文件内容加载到内存中。

    【讨论】:

    • @Barun - 你找到问题的答案了吗?
    【解决方案2】:

    您可以使用BinaryReader 类。

    double value;
    using( Stream stream = File.OpenRead(fileName) )
    using( BinaryReader reader = new BinaryReader(stream) )
    {
        value = reader.ReadDouble();
    }
    

    对于第二点,如果您知道偏移量,只需使用Stream.Seek 方法即可。

    【讨论】:

      【解决方案3】:

      似乎我们需要知道双精度值是如何在文件中编码的,然后才能找到它。

      【讨论】:

      • 有不同的编码方式吗?
      • 也许这个值是使用 C++ 使用默认编码编写的。
      • 当然,IEEE 754 是标准编码,但双精度值可以以另一种形式编码。你对源文件了解多少?正如@AlexAza 指出的那样,除非您知道偏移量,否则您将很难知道您是否获得了“正确”的双倍。如果您对文件的格式一无所知,我不知道是否可以找到任意双精度值。
      • 嗯,它是一个 .wt1 文件。一些自定义数据库。 (Winpilot 热数据库)
      • 不幸的是,我认为要从文件中获取有用的信息,您将需要知道它是如何编码的以及格式(即编码信息在文件中的组织方式) .
      【解决方案4】:

      1)

              double theDouble;
              using (Stream sr = new FileStream(@"C:\delme.dat", FileMode.Open, FileAccess.Read))
              {
                  byte[] buffer = new byte[8];
                  sr.Read(buffer, 0, 8);
      
                  theDouble = BitConverter.ToDouble(buffer, 0);
              }
      

      2) 你不能。

      【讨论】:

      • 我不能使用位移并每次创建一个 64 位并读取该值吗?
      • 如果你知道二进制文件只包含双精度,那么是的,但我认为你的问题是“我有一个随机二进制文件。我如何在里面的某个地方找到一个双精度?”
      • 有什么方法可以逐位读取文件吗? (不是一个完整的字节)
      • 没有。但是您始终可以读取一个字节并使用位运算符提取位
      【解决方案5】:

      以下是如何读取(以及出于测试目的写入)双精度数:

          // Write Double
          FileStream FS = new FileStream(@"C:\Test.bin", FileMode.Create);
          BinaryWriter BW = new BinaryWriter(FS);
      
          double Data = 123.456;
      
          BW.Write(Data);
          BW.Close();
      
          // Read Double
          FS = new FileStream(@"C:\Test.bin", FileMode.Open);
          BinaryReader BR = new BinaryReader(FS);
      
          Data = BR.ReadDouble();
          BR.Close();
      

      从大文件中取出数据取决于文件中数据的布局方式。

      【讨论】:

      • 您应该使用using 块而不是仅仅调用Close
      • “教学”代码与生产代码不同。在生产代码中,我处理所有错误并计划所有意外事件。在教授代码的过程中,我会尽可能简单地传达概念。
      • 虽然错误处理是另一回事,但我坚信在这样的代码示例中遵循某些最佳实践非常重要,因此您不要教人们坏习惯。 using 关键字绝对属于该类别。另外,恕我直言 using 在这种情况下实际上使代码更简单。
      【解决方案6】:
      using (FileStream filestream = new FileStream(filename, FileMode.Open))
      using (BinaryReader reader = new BinaryReader(filestream))
      {
          float x = reader.ReadSingle();
      }
      

      【讨论】:

        猜你喜欢
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-15
        • 1970-01-01
        相关资源
        最近更新 更多