【问题标题】:Converting binary reading function from C++ to C#将二进制读取函数从 C++ 转换为 C#
【发布时间】:2012-03-16 09:07:39
【问题描述】:

老实说,我对用 C# 读取二进制文件感到非常困惑。 我有用于读取二进制文件的 C++ 代码:

FILE *pFile = fopen(filename, "rb");    
uint n = 1024;
uint readC = 0;
do {
    short* pChunk = new short[n];
    readC = fread(pChunk, sizeof (short), n, pFile);    
} while (readC > 0);

它会读取以下数据:

-156, -154, -116, -69, -42, -36, -42, -41, -89, -178, -243, -276, -306,...

我尝试将此代码转换为 C#,但无法读取此类数据。这是代码:

using (var reader = new BinaryReader(File.Open(filename, FileMode.Open)))
{
     sbyte[] buffer = new sbyte[1024];                
     for (int i = 0; i < 1024; i++)
     {
         buffer[i] = reader.ReadSByte();
     }                
}

我得到以下数据:

100, -1, 102, -1, -116, -1, -69, -1, -42, -1, -36 

我怎样才能得到相似的数据?

【问题讨论】:

  • 在 C++ 中,您将每个实体读取为 short,即 2 个字节,而在 C# 中,您将每个实体读取为 sbyte,即 1 个字节。跨度>
  • @Jason 在 C++ 中肯定没有完全定义 short 的大小;p 但是:我不反对。您应该将其添加为答案。
  • 我不知道,没有 C++ 经验;/
  • 在 C++ 示例中,您读取的是短数据类型,而在 C# 示例中,您使用的是有符号字节,数据范围要小得多。您是否尝试在 C# 示例中将 sbyte 更改为 short ?
  • 确实,-178、-243、-306 等完全在 sbyte 范围之外 - 所以这永远不会像 sbyte 那样工作

标签: c# c++ c c#-4.0


【解决方案1】:

short 不是带符号的字节,它是带符号的 16 位值。

 short[] buffer = new short[1024];                
 for (int i = 0; i < 1024; i++) {
     buffer[i] = reader.ReadInt16();
 }

【讨论】:

    【解决方案2】:

    那是因为在 C++ 中您正在阅读短裤,而在 C# 中您正在阅读有符号字节(这就是 SByte 的含义)。你应该使用reader.ReadInt16()

    【讨论】:

      【解决方案3】:

      您的 C++ 代码一次读取 2 个字节(您使用的是 sizeof(short)),而您的 C# 代码一次读取一个字节。一个 SByte(参见 http://msdn.microsoft.com/en-us/library/d86he86x(v=vs.71).aspx)使用 8 位存储空间。

      【讨论】:

        【解决方案4】:

        您应该使用相同的数据类型来获得正确的输出或转换为新类型。

        在 c++ 中,您使用的是short。 (我想该文件也是用short 编写的)所以在c# 中使用short 本身。或者你可以使用Sytem.Int16

        您得到不同的值,因为 shortsbyte 不相等。 short 是 2 个字节,Sbyte 是 1 个字节

        using (var reader = new BinaryReader(File.Open(filename, FileMode.Open)))
        {
             System.Int16[] buffer = new System.Int16[1024];                
             for (int i = 0; i < 1024; i++)
             {
                 buffer[i] = reader.ReadInt16();
             }                
        }
        

        【讨论】:

          猜你喜欢
          • 2018-06-01
          • 2019-12-03
          • 2020-11-24
          • 2012-03-26
          • 2014-10-26
          • 2014-04-21
          • 2017-07-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多