You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++转C#:fread代码改写及int字节读取困惑求解

把C++的fread读取int数组逻辑转成C#的解决方案

嘿,刚接触面向对象就跨语言转代码,挺有挑战的!我来帮你理清这事儿~

首先得先搞懂你要转换的那行C++代码到底在做什么:

fread(top, sizeof(int), 16, stream);

这行代码的作用是:

  • 从stream这个文件流里读取数据,填充到top数组里
  • sizeof(int)表示每个要读取的元素的字节数(在绝大多数平台上,C++的int是4字节,和C#里的int一致)
  • 16是要读取的元素数量,所以总共会读取 16 * 4 = 64 字节的数据,刚好填满static int top[16]这个数组

接下来看你的C#代码问题:你已经把整个文件读到了buffer字节数组里,但不知道怎么把对应的字节拆成16个int元素的数组。这里给你两种靠谱的解决方案:

方案一:用BitConverter从已读取的byte数组转换

如果你已经把整个文件读到了buffer里,可以循环把每4个字节转换成一个int:

// 假设buffer是你已经读取好的文件字节数组
int[] top = new int[16];
for (int i = 0; i < 16; i++)
{
    // 每个int占4字节,所以第i个int的起始索引是i*4
    top[i] = BitConverter.ToInt32(buffer, i * 4);
    
    // 注意:如果你的.eng文件是大端字节序(比如原C++程序运行在大端系统上),
    // 需要先反转字节再转换,代码改成这样:
    // byte[] intBytes = new byte[4];
    // Array.Copy(buffer, i*4, intBytes, 0, 4);
    // Array.Reverse(intBytes);
    // top[i] = BitConverter.ToInt32(intBytes, 0);
}

方案二:用BinaryReader直接读取(更接近C++的fread逻辑)

如果你不需要先读取整个文件,用BinaryReader可以直接从文件流里读取16个int,和C++的写法更对应:

using (FileStream fs = new FileStream("yourfile.eng", FileMode.Open))
using (BinaryReader reader = new BinaryReader(fs))
{
    int[] top = new int[16];
    for (int i = 0; i < 16; i++)
    {
        // 每次读取一个4字节的int,填充到数组里
        top[i] = reader.ReadInt32();
    }
    // 之后就可以用top数组来处理数据,转成.csv了
}

最后说下你现有代码里的小问题:你定义了byte[] top = new byte[16];,这和C里的int top[16]完全不是一回事哦——C的数组是存16个int(每个4字节),而你现在的是16个byte,所以肯定不对,得改成int[] top = new int[16];才行。

内容的提问来源于stack exchange,提问作者Whyobjects

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:44:04