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
相关产品推荐
相关产品推荐

